zoukankan      html  css  js  c++  java
  • C#中的预处理指令详解

    这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等预处理指令,需要的朋友可以参考下
     
     

    目录

    1. #define 和 #undef
    2. #if、#elif、#else 和#endif
    3. #warning 和 #error
    4. #region 和#endregion
    5. #line
    6. #pragma

      C#中有许多名为“预处理指令”的命令。这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面。

      例如,使用预处理指令可以禁止编译器编译代码的某一部分。如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理指令。在编译软件的基本版本时,使用预处理指令可以禁止编译器编译与额外功能相关的代码。

      另外,在编写提供调试信息的代码时,也可以使用预处理指令。实际上,在销售软件时,一般不希望编译这部分代码。

      预处理指令的开头都有符号#。

      C++开发人员应知道,在C 和C++中预处理指令非常重要,但是,在C#中,并没有那么多的预处理指令,它们的使用也不太频繁。C#提供了其他机制来实现许多C++指令的功能,如定制特性。还要注意,C#并没有一个像C++那样的独立预处理器,所谓的预处理指令实际上是由编译器处理的。

      尽管如此,C#仍保留了一些预处理指令名称,因为这些命令会让人觉得就是预处理器。

      下面简要介绍预处理指令的功能。

     
    1. #define 和 #undef

      #define 的用法如下所示: #define DEBUG

      它告诉编译器存在给定名称的符号,在本例中是DEBUG。这有点类似于声明一个变量,但这个变量并没有真正的值,只是存在而已。

      这个符号不是实际代码的一部分,而只在编译器编译代码时存在。在C#代码中它没有任何意义。


      #undef 正好相反—— 它删除符号的定义: #undef DEBUG

      如果符号不存在,#undef 就没有任何作用。同样,如果符号已经存在,则#define 也不起作用。必须把#define 和#undef 命令放在C#源文件的开头位置,在声明要编译的任何对象的代码之前。

      #define 本身并没有什么用,但与其他预处理器指令(特别是#if)结合使用时,它的功能就非常强大了。

      这里应注意一般C#语法的一些变化。预处理器指令不用分号结束,一般一行上只有一条命令。这是因为对于预处理器指令,C#不再要求命令使用分号进行分隔。如果它遇到一条预处理器指令,就会假定下一条命令在下一行上。


    2. #if、#elif、#else 和#endif
      这些指令告诉编译器是否要编译某个代码块。考虑下面的方法:

    复制代码代码如下:

    int DoSomeWork(double x)
    {
      // do something
      #if DEBUG
      Console.WriteLine("x is " + x);
      #endif
    }

      这段代码会像往常那样编译,但Console.WriteLine 命令包含在#if 子句内。

      这行代码只有在前面的#define 命令定义了符号DEBUG 后才执行。

      当编译器遇到#if 语句后,将先检查相关的符号是否存在,如果符号存在,就编译#if 子句中的代码。否则,编译器会忽略所有的代码,直到遇到匹配的#endif 指令为止。

      一般是在调试时定义符号DEBUG,把与调试相关的代码放在#if 子句中。在完成了调试后,就把#define 语句注释掉,所有的调试代码会奇迹般地消失,可执行文件也会变小,最终用户不会被这些调试信息弄糊涂(显然,要做更多的测试,确保代码在没有定义DEBUG 的情况下也能工作)。

      这项技术在C 和C++编程中十分常见,称为条件编译(conditional compilation)。

      #elif (=else if)和#else 指令可以用在#if 块中,其含义非常直观。也可以嵌套#if 块:

    #line 164 "Core.cs" // We happen to know this is line 164 in the file
    // Core.cs, before the intermediate
    // package mangles it.
    // later on
    #line default // restores default line numbering

    6. #pragma
      #pragma 指令可以抑制或还原指定的编译警告。与命令行选项不同,#pragma 指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。

      下面的例子禁止“字段未使用”警告,然后在编译MyClass 类后还原该警告。

    复制代码
    #pragma warning disable 169
    public class MyClass
    {
      int neverUsedField;
    }
    #pragma warning restore 169
    复制代码
  • 相关阅读:
    Django_环境配置(一)
    python 使用sub替换时报错“re.error: bad escape P”或 “SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes”
    python 获取异常全部信息
    Flink入门 构建一个应用
    Flink入门 本地环境搭建
    mysql数据库 使用分析工具 进行慢查询分析
    Windows环境下搭建 【ElasticSearch】
    SpringBoot 事务的控制
    spring boot 数据库事务检查
    利用jenkins一键部署项目
  • 原文地址:https://www.cnblogs.com/dayang12525/p/6394318.html
Copyright © 2011-2022 走看看