预处理指令

预处理指令是一种给编译器的指令,用来在实际的编译开始之前预处理一些信息。

所有的预处理指令都以 # 开始,并且在一行预处理指令中,只有空白字符可以出现在指令之前。预处理指令没有声明,所以他们不需要以分号(;)结尾。

C# 编译器不具有独立的预处理机制;然而,指令执行的时候就像是只有这一条一样。在 C# 中,预处理指令被用来帮助条件编译。不像 C 或 C++ 的指令,他们不能创建宏。一个预处理指令必须是这一行代码中的唯一的指令。

C# 中的预处理指令

下面的表格中列出了 C# 中可用的预处理指令:

预处理指令 描述
#define 定义了一串字符,称为符号。
#undef 可以取消定义的符号。
#if 测试一个或多个表达式的结果是否为真。
#else 用于创建复合条件指令,和 #if 一起使用。
#elif 用于创建复合条件指令。
#endif 指出条件指令的结尾。
#line 可以修改编译器的行号,选择性修改输出错误和警告的文件名
#error 从代码的特定位置生成误差
#warning 从代码的特定位置生成一级预警
#region 当你使用 Visual Studio 代码编译器时,你可以展开或折叠一部分代码块
#engregion 它标志着 #region 块的结束

#define 指令

#define预处理指令是用来创建符号常量的。

应用 #define 可以定义一个符号,这个符号会作为一个表达式传递给 #if 指令,这个判断会得到 ture 的 结果。语法如下:

  1. #define symbol

下面的程序说明了这一点:

  1. #define PI
  2. using System;
  3. namespace PreprocessorDAppl
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. #if (PI)
  10. Console.WriteLine("PI is defined");
  11. #else
  12. Console.WriteLine("PI is not defined");
  13. #endif
  14. Console.ReadKey();
  15. }
  16. }
  17. }

编译执行上述代码,得到如下结果:

  1. PI is defined

条件指令

你可以使用 #if 指令创建一个条件指令。条件指令可以用来判断一个或多个符号是否为真。如果他们的结果为真,编译器就会执行 #if 和下一条指令间的所有代码。

条件指令的语法如下:

  1. #if symbol [operator symbol]...

当你想测试的符号是 “symbol”这个名字的时候。你也可以使用 ture 和 false 或者提前使用反运算符操作这个符号。

operator symbol(运算符符号)是一种用于符号求值的运算符。运算符可以是下列之一:

  • == (相等)
  • != (不相等)
  • && (与)
  • || (或)

你也可以通过括号使用组符号和组运算符。条件指令用于编译代码生成 debug 或者是编译特定配置时。一个条件指令以 #if 开头并且必须明确的以 #endif 指令结束。

下面的程序示范了条件指令的使用方法:

  1. #define DEBUG
  2. #define VC_V10
  3. using System;
  4. public class TestClass
  5. {
  6. public static void Main()
  7. {
  8. #if (DEBUG && !VC_V10)
  9. Console.WriteLine("DEBUG is defined");
  10. #elif (!DEBUG && VC_V10)
  11. Console.WriteLine("VC_V10 is defined");
  12. #elif (DEBUG && VC_V10)
  13. Console.WriteLine("DEBUG and VC_V10 are defined");
  14. #else
  15. Console.WriteLine("DEBUG and VC_V10 are not defined");
  16. #endif
  17. Console.ReadKey();
  18. }
  19. }

编译执行上述代码,得到如下结果:

  1. DEBUG and VC_V10 are defined