目录
- 预处理指令简介
- #define、#undef
- #if、#elif、#else、#endif
- #warning、#error
- #region、#endregion
- #line、#line default
- #pragma
预处理指令简介
微软对预处理指令解释链接
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/index
预处理指令不会转化为可执行代码中的命令,但会影响编译过程的各个方面。例如使用预处理指令可以禁止编译器编译代码的某一部分。
预处理器指令的开头都有符号#
#define、#undef
#define的用法如下所示:
#define DEBUG
它告诉编译器存在给定名称的符号,在本例中是DEBUG。这有点类似于声明的一个变量,但这个变量并没有真正的值,只是存在而已。这个符号不是实际代码的一部分,而只在编译器编译代码时存在。在C#代码中它没有任何意义。
#undef 删除符号的定义:
#undef DEBUG
如果符号不存在,#undef就没有任何作用。同样如果符号已经存在,则define也不起作用。
必须把#define和#undef命令放在C#文件的开头位置,在声明要编译的任何对象的代码之前。
#if、#elif、#else、#endif
#if与#endif
# if DEBUG
。。。。。。。代码
# endif
包含在#if与#endif之间代码只有在定义了符号DEBUG后才会执行,否则将会忽略代码。
#elif(=else if)、#else
这两个预处理指令就和if/else的指令用法一样。
#if与#elif还支持一组逻辑运算符操作,“!”、“==”、“!=”、“||”。如果符号存在认为是true否则为false。
#warning、#error
当编译器遇到这两个指令时,会分别产生警告或错误。
- 如果编译器遇到#warning指令,会向用户显示#warning指令后边的文本,之后编译继续进行。
- 如果编译器遇到#error指令,会向用户显示#error指令后边的文本,作为一条编译错误消息,然后会立即退出编译,不会生成IL代码。
#region、#endregion
#region和#endregion指令用于把一段代码视为有给定名称的一个块
#region 代码片名称
在这里插入代码片
#endregion
在vs中使用#region和#endregion指令的块可以被折叠。这样代码布局看起来更合理。
#line、#line default
#line指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。这条指令用的并不多。
#line default把行号还原为默认的行号
#pragma
#pragma指令可以抑制或者还原指定的编译警告。与命令行选项不同,#pragma指令可以在类或方法级别实现,对抑制警告的内容和抑制的时间进行更精细的控制。
下边的例子禁止字段未使用警告,然后在编译MyClass类后还原警告:
#pragma warning disable 169
public class MyClass
{
int A=1;
}
#pragma warning restore 169