这篇文章主要介绍了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

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

  1. #pragma 预处理指令详解

    源地址:http://blog.csdn.net/jx_kingwei/article/details/367312 #pragma  预处理指令详解              在所有的预处理指令中, ...

  2. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解   #pragma comment( comment-type [,"commentstring"] ) 该宏放置一 ...

  3. C++中的#pragma 预处理指令详解

    源地址:http://blog.csdn.net/roger_77/article/details/660311 在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态 ...

  4. 常用C/C++预处理指令详解

    预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查.预处理命令以符号“#”开头. 常用的预处理指令包括: 宏定义:#define 文件包含:#include 条件编译:#i ...

  5. pragma指令详解(转载)

    #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注释到对象文件或者可执行文件.comment-type是一个预定义 ...

  6. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  7. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  8. nginx.conf中关于nginx-rtmp-module配置指令详解

    译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解.指令Corertmp语法:rtmp { ... }上下文:根描述:保存所 ...

  9. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

随机推荐

  1. Java基础-考察JVM内部结构的常用工具介绍

    Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...

  2. CENTOS 升级Nodejs 到最新版本

    1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过  uname -a ...

  3. Hbase记录-Hbase Web管理工具

    1.Hmaster的Web接口-端口参数:hbase.master.info.port  默认为16010 http://hbase_master_server:16010 可查看hbase的版本信息 ...

  4. 动态生成js数据Response.Expires=1440竟然无效?

    项目当中有一些数据,比如多语言翻译,要求做语言包,起初当然是做成i18n.js文件,但是每个阶段版本更新都会增加一些key,那么发布的时候只能给<script>的src增加?2018091 ...

  5. 关于Mac OS虚拟机下共享文件夹的方法

    1.确保左上角苹果标志的旁边是“Finder”: 2.点击"Finder": 3.选择“偏好设置设置”: 4.然后在“通用”标签下勾选“已连接服务器”: OK,搞定!   完成以上 ...

  6. 2 Player and N Coin

    class Solution { public void printChoices(int[] A, int[][] C) { System.out.println("硬币列表如下:&quo ...

  7. Java基础编程题——素数

    package com.yangzl.basic; /** * 判断101-200之间有多少个素数,并输出所有素数. * @author Administrator * */ /*程序分析:判断素数的 ...

  8. Linux之目录结构解析

    /    /bin 存放[二进制可执行命令]目录,与usr/bin相比,它是系统性的.主要放置一些系统的必备执行档.例如:cat.cp.chmod df.dmesg.gzip.kill.ls. mkd ...

  9. 离线安装IDEA插件

    1.idea插件官网http://plugins.jetbrains.com/idea 搜索并下载对应的插件的zip包 2.打开软件进行离线安装 IDEA-->Setting-->Plug ...

  10. 浏览器调用接口发现Provisional headers are shown

    一次请求时候报错 无论如何也找不到错误,后台接口和前端请求都是正确的.后来发现是 自己浏览器上装了广告拦截的插件 把我这个请求给拦截 果断卸载插件立马就好了.