导读

1、什么是预处理

2、预处理的好处

3、C#中的常见预处理指令

4、总结


什么是预处理

        在计算机科学中,预处理通常是指利用某一程序(通常是预处理器)对某一格式的源码(如.cs C#源代码)按照一些规则进行源码替换的过程。这个过程发生在词法分析阶段,得到的仍然是源码文件。对于编译而言简单来讲可分为三个阶段,词法分析、语法分析、可执行程序的生成。

上面是我自己的理解,可能不准确。PS我曾旁听过中科大两学期的编译原理课,但都是因为某些原因工作加班等没有一学期是坚持下去完整听完的,真心惭愧

预处理的好处

        这个有什么好处,我暂时还没归纳出来。日后补上

C#中的常见预处理指令

        C#中常见预处理指令可分为4类:

1、预处理符号定义指令 #define  和 #undef

2、条件编译指令 #if #elif #else #endif

3、诊断指令  #error 和 #warning

4、region 指令 #region  #endregion

现在一一说明

预处理定义符号

我们可以用 #define 定义预处理符号,用 #undef 取消预处理符号的定义,虽然编译器提供了这样的机制,但我不建议将预处理符号定义写在源代码中,因为这样就缺少变通性。C#编译器提供了一个命令可以将预处理符号的定义放在命令行参数中 csc /d:SybolName ..,推荐采用编译器命令参数的形式定义预处理符号

条件编译指令

#if #elif #else #endif 和C#语法if-elseif else 的语义类似,这里就不多说了。它支持 && || ! 登陆逻辑组合

我们看个例子  demo.cs

// #define Debug_Mode1  // 定义预处理符号  Debug_Mode1
// #undef Debug_Mode1 // 取消定义预处理符号 Debug_Mode1
using System;
class App
{
static void Main()
{
#if (Debug_Mode1 && !Debug_Mode2) // 只开启 Debug_Mode1
Debug_Mode1();
#elif (!Debug_Mode1 && Debug_Mode2) // 只开启 Debug_Mode2
Debug_Mode2();
#elif (Debug_Mode1 && Debug_Mode2) // 同时开启 Debug_Mode1和Debug_Mode2
Debug_Mode1();
Debug_Mode2();
#else
Console.WriteLine("正常运行");
#endif
} #if(Debug_Mode1)
static void Debug_Mode1()
{
Console.WriteLine("开启Debug_Mode1模式");
}
#endif #if(Debug_Mode2)
static void Debug_Mode2()
{
Console.WriteLine("开启Debug_Mode2模式");
}
#endif
}

编译命令分别为

csc demo.cs

csc /d:Debug_Mode1 demo.cs

csc /d:Debug_Mode2 demo.cs

csc /d:Debug_Mode1,Debug_Mode2 demo.cs

运行效果分别为

 

诊断指令

格式

#error message

#waming message

message 可以是任何格式文本,比如中文

看代码  diaDemo.cs

using System;
#warning 编译代码前必须先Git代码 如已经Git过代码可无视
class App
{
static void Main()
{
DebugInvoke();
#if !Debug_Mode
Console.WriteLine("正常运行");
#endif
} static void DebugInvoke()
{
#if !Debug_Mode
#error 这个方法只能在调试模式中使用
#endif
Console.WriteLine("现在进入调试模式...");
}
}

编译命令分别为

csc diaDemo.cs

csc /d:Debug_Mode diaDemo.cs

效果分别为

 

region 指令

这个指令我想用过C#的都应该熟悉,略去不表

 

总结

1、源文件中的任何 #define 和 #undef 指令都必须出现在源文件中的一个C#标识符前面,否则将出现编译时错误

2、不建议用#define 方式在源代码中定义预编译符号,建议采用编译器命令行参数的方式定义预编译符号

3、预处理符号定义是在编译时指定不是运行时指定

看一个运行时指定运行参数的例子  demo2.cs

using System;

class App
{
static void Main(string[] args)
{
foreach(string arg in args)
{
Console.WriteLine(arg);
}
}
}

编译命令 csc demo2.cs

运行效果

 

本文完

C# 预处理指令的更多相关文章

  1. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  2. C/C++预处理指令#define,#ifdef,#ifndef,#endif…

    2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...

  3. Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令

    第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生 ...

  4. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  5. C#中的预处理指令

    C#中的预处理指令 作为预处理中的一对:#region name ,#endregion可能是大家使用得最多的,我也常用它来进行代码分块,在一个比较长的cs文件中,这么做确实是一件可以让你使代码更清晰 ...

  6. C#学习笔记(十五):预处理指令

    C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...

  7. iOS预处理指令

    预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.可见预处理过程先于编译器对源代码进行处理. 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空 ...

  8. #pragma预处理指令讲解

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  9. C学习笔记之预处理指令

          一.什么是预处理指令            预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译. 预处理指令一般以 # 号开头,能够出如今文件的不论什么地方, ...

随机推荐

  1. hdu 4115 (2—SAT)

    题意:两个人石头剪刀布,一个人的出法已确定,另一个人的出法有一定约束,某两次要相同或者不同,问你第二个人能否全部都不失败. 思路:根据Bob出的情况,我们可以确定每次Alice有两种方案. R与P,S ...

  2. 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)

    前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想:        1. 栈初始化        2. 输出起始顶点,起始顶点改为“已访问”标志,将 ...

  3. 锋利的jquery第二版学习笔记

    jquery系统学习笔记 一.初识:jquery的优势:1.轻量级(压缩后不到30KB)2.强大的选择器(支持css1.css2选择器的全部 css3的大部分 以及一些独创的 加入插件的话还可支持XP ...

  4. 【STL源码学习】细品vector

    第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. ve ...

  5. Objective-C中的Block(闭包) (轉載)

    来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...

  6. Android v4 包和v7包问题

    昨天新建了一个android项目,加入了一个bootstrap的外部依赖和一个底部导航栏的外部依赖.结果jj 了,老是提醒我v4包v7包冲突: 事实是这样的,首先我的底部导航依赖库里面有一个v4包,那 ...

  7. linux makefile: c++ 编程_基础入门_如何开始?

    学习android 终究还是需要研究一下其底层框架,所以,学习c++很有必要. 这篇博客,算是linux(ubuntu) 下学习 c++ 的一个入门. 刚开始学习编程语言的时候,最好还是使用命令行操作 ...

  8. HDU 5501 The Highest Mark 背包dp

    The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  9. [React Fundamentals] Component Lifecycle - Updating

    The React component lifecycle will allow you to update your components at runtime. This lesson will ...

  10. [Javascript] Introduce to Webpack

    To use webpack, first you need to run: npm install webpack 2. Create a webpack.config.js file: modul ...