c#什么时候有必要用到c语言中预处理命令

2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
本帖子已过去太久远了,不再提供回复功能。C#预处理器指令 - 推酷
C#预处理器指令
C#中的预处理器指令
1.#define 和 #undef
2.#if、#elif、#else 和#endif
3.#warning 和 #error
4.#region 和#endregion
C#中有许多名为“预处理器指令”的命令。这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面。
例如,使用预处理器指令可以禁止编译器编译代码的某一部分。如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理器指令。在编译软件的基本版本时,使用预处理器指令可以禁止编译器编译与额外功能相关的代码。
另外,在编写提供调试信息的代码时,也可以使用预处理器指令。实际上,在销售软件时,一般不希望编译这部分代码。
预处理器指令的开头都有符号#。
C++开发人员应知道,在C 和C++中预处理器指令非常重要,但是,在C#中,并没有那么多的预处理器指令,它们的使用也不太频繁。C#提供了其他机制来实现许多C++指令的功能,如定制特性。还要注意,C#并没有一个像C++那样的独立预处理器,所谓的预处理器指令实际上是由编译器处理的。
尽管如此,C#仍保留了一些预处理器指令名称,因为这些命令会让人觉得就是预处理器。
下面简要介绍预处理器指令的功能。
1. #define 和 #undef
#define 的用法如下所示:
它告诉编译器存在给定名称的符号,在本例中是DEBUG。这有点类似于声明一个变量,但这个变量并没有真正的值,只是存在而已。
这个符号不是实际代码的一部分,而只在编译器编译代码时存在。在C#代码中它没有任何意义。
#undef 正好相反—— 它删除符号的定义:
如果符号不存在,#undef 就没有任何作用。同样,如果符号已经存在,则#define 也不起作用。必须把#define 和#undef 命令放在C#源文件的开头位置,在声明要编译的任何对象的代码之前。
#define 本身并没有什么用,但与其他预处理器指令(特别是#if)结合使用时,它的功能就非常强大了。
这里应注意一般C#语法的一些变化。预处理器指令不用分号结束,一般一行上只有一条命令。这是因为对于预处理器指令,C#不再要求命令使用分号进行分隔。如果它遇到一条预处理器指令,就会假定下一条命令在下一行上。
2. #if、#elif、#else 和#endif
这些指令告诉编译器是否要编译某个代码块。考虑下面的方法:
1 int DoSomeWork(double x)
// do something
Console.WriteLine(&x is & + x);
这段代码会像往常那样编译,但Console.WriteLine 命令包含在#if 子句内。
这行代码只有在前面的#define 命令定义了符号DEBUG 后才执行。
当编译器遇到#if 语句后,将先检查相关的符号是否存在,如果符号存在,就编译#if 子句中的代码。否则,编译器会忽略所有的代码,直到遇到匹配的#endif 指令为止。
一般是在调试时定义符号DEBUG,把与调试相关的代码放在#if 子句中。在完成了调试后,就把#define 语句注释掉,所有的调试代码会奇迹般地消失,可执行文件也会变小,最终用户不会被这些调试信息弄糊涂(显然,要做更多的测试,确保代码在没有定义DEBUG 的情况下也能工作)。
这项技术在C 和C++编程中十分常见,称为条件编译(conditional compilation)。
#elif (=else if)和#else 指令可以用在#if 块中,其含义非常直观。也可以嵌套#if 块:
#define ENTERPRISE
#define W2K
// further on in the file
#if ENTERPRISE
// do something
// some code that is only relevant to enterprise
// edition running on W2K
#elif PROFESSIONAL
// do something else
// code for the leaner version
与C++中的情况不同,使用#if 不是有条件地编译代码的唯一方式,C#还通过Conditional 特性提供了另一种机制。
#if 和#elif 还支持一组逻辑运算符“!”、“==”、“!=”和“||”。如果符号存在,就被认为是true,否则为false,例如:
1 #if W2K && (ENTERPRISE==false) // if W2K is defined but ENTERPRISE isn't
#warning 和 #error
另两个非常有用的预处理器指令是#warning 和#error,当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到#warning 指令,会给用户显示#warning 指令后面的文本,之后编译继续进行。如果编译器遇到#error 指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译,不会生成IL 代码。
使用这两条指令可以检查#define 语句是不是做错了什么事,使用#warning 语句可以提醒自己执行某个操作:
1 #if DEBUG && RELEASE
2 #error &You've defined DEBUG and RELEASE simultaneously!&
4 #warning &Don't forget to remove this line before the boss tests the code!&
5 Console.WriteLine(&*I hate this job.*&);
4. #region 和#endregion
#region 和#endregion 指令用于把一段代码标记为有给定名称的一个块,如下所示。
1 #region Member Field Declarations
5 #endregion
这看起来似乎没有什么用,它不影响编译过程。这些指令的优点是它们可以被某些编辑器识别,包括Visual Studio .NET 编辑器。这些编辑器可以使用这些指令使代码在屏幕上更好地布局。
#line 指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。这条指令用得并不多。
如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变输入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编辑的文件名不匹配。
#line 指令可以用于还原这种匹配。也可以使用语法#line default 把行号还原为默认的行号:
1 #line 164 &Core.cs& // We happen to know this is line 164 in the file
2 // Core.cs, before the intermediate
3 // package mangles it.
4 // later on
5 #line default // restores default line numbering
6. #pragma
#pragma 指令可以抑制或还原指定的编译警告。与命令行选项不同,#pragma 指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。
下面的例子禁止“字段未使用”警告,然后在编译MyClass 类后还原该警告。
1 #pragma warning disable 169
2 public class MyClass
int neverUsedF
6 #pragma warning restore 169
感谢大家收看,谢谢亲们了。
参考资料:《C#高级编程 第8版》
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致C#预处理器指令
C#预处理器指令
发布时间: 15:52:54
编辑:www.fx114.net
本篇文章主要介绍了"C#预处理器指令",主要涉及到C#预处理器指令方面的内容,对于C#预处理器指令感兴趣的同学可以参考一下。
C#预处理器指令是在编译时调用的。预处理器指令(preprocessor directive)告诉C#编译器要编译哪些代码,并指出如何处理特定的错误和警告。C#预处理器指令还可以告诉C#编辑器有关代码组织的信息。
1. 定义符号和取消符号定义的预处理指令#define 和 #undef
预处理指令都以#号开头并位于行首前面可以出现空格符。
#define DEBUG#define ISSAY&&
上面的语句定义了连个个预编译的符号,他的作用域是他所处整个文件,定义符号的语句必须出现在所有代码之前, 否则编译的时候会出现一个异常:&不能在文件的第一个标记之后,定义或取消定义预处理器符号&。我们也可以使用#undef来取消一个符号的定义,先来看个例子。
#define DEBUG#undef DEBUG#define ISSAY&&&&&using&S &&namespace&JustDoIt &&{ &&&&&&class&Program &&&&&& { &&&&&&&&&&static&void&Main(string[]
args) &&&&&&&&&& {&&&&&&&&&&&& #if DEBUG&&&&&&&&&&&&&&& Console.Write(&debug.&);&&&&&&&&&&&& #endif&&&&&&&&&&&& #if ISSAY&&&&&&&&&&&&&&& Console.Write(&hello.&);&&&&&&&& #else&&&&&&&&&&&&&&& Console.Write(&you can say nothing.&);&&&&&&&&&&&& #endif&&&&&&&&&&&&& Console.ReadLine(); &&&&&&&&&& } &&&&&& } &&} &&//输出:hello&&
从上面的代码我们可以看到第一样等一了符号DEEBU,紧接着第二行取消了这个符号的定义,也就是相当于没有定义一样,所以程序运行的时候不会执行Console.Write(&debug.&)这个语句。第三行定义了ISSAY符号,所以程序输出了“hello”,如果我们把他注释了或者是删除了,那么程序会输出“you can say nothing“。我们可以初步看到通过定义预编译的符号,可以控制编译器选择性地编译代码。上面的代码中还有#if和#endif这样的符号,这些是条件编译指令。
2. 条件编译指令
条件编译指令有4个,除了我们从第一个示例看到的#if、#else、#endif之外,还有一个#elif。我们对这些指令应该有是曾相识的感觉,他们跟我们平时编写代码的时候试用的条件语句是一样的,条件语句是用来控制程序流的,而这些条件编译指令是用来控制编译器选择性地编译代码的。
一条#if语句可以有0条或多条#elif语句,也可以有0条或一条#else 语句,但必须包括一条#endif语句必须有,否则会出现语法错误。
3. #region和#endregion
这两个符号平时我们肯定用的很多了,就是把一些相关的代码折叠到一起,这样对我们在一个文件中编写较长的代码非常有用,我们可以把一组相关的代码用#region和#endregion组织在一起并且可以在#region后面加上说明的文字,当这组代码被折叠起来的时候,我们可以看到#region后面的说明文字。
引用网址:http://www.laoney.net/post//237455.aspx
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:简单介绍C#预处理
简单介绍C#预处理
  C#预处理
  C#预处理阶段是一个文本到文本的转换阶段,在预处理过程中,使能进行代码的条件包含和排除。    pp-un&it: &  pp-gro&up&opt &  pp-gro&up: &  pp-gro&up-part &  pp-gro&up&pp-group-part &  pp-gro&up-part: &  pp-tokensopt&new-line &  pp-de&claration &  pp-if&-section &  pp-con&trol-line &  pp-l&ine-number &  pp-tokens: &  pp-token &  pp-tokens&pp-token &  pp-token: &  identifi&er &  keyword &  literal &  operator-or-punctuator &  new-line: &  The&carriage&return&character&(U+000D) &  The&line&feed&character&(U+000A) &  The&carriage&return&character&followed&by&a&line&feed&character &  The&line&separator&character&(U+2028) &  The&paragraph&separator&character&(U+2029)&
  C#预处理声明
  在预处理过程中,为了使用名称可以被定义和取消定义。#define 定义一个标识符。#undef “反定义”一个标识符,如果一个标识符在以前已经被定义了,那么它就变成了不明确的。如果一个标识符已经被定义了,它的语意就等同于true ;如果一个标识符没有意义,那么它的语意等同于false.    pp-de&claration: &  #define&pp-identifier &  #undef&pp-identifier&
  来看看这个例子:    #define&A &  #undef&B &  class&C &  { &  #if&A &  void&F() &  #else &  void&G() &  #endif &  #if&B &  void&H() &  #else &  void&I() &  #endif &  } &  变为: &  class&C &  { &  void&F() &  void&I() &  }&
  如果有一个pp-unit, 声明就必须用pp- token 元素进行。换句话说,#define 和#undef 必须在文件中任何 “真正代码”前声明,否则在编译时会发生错误。因此,也许会像下面的例子一样散布#if 和#define:    define&A &  #if&A &  #define&B &  #endif &  namespace&N &  { &  #if&B &  class&Class1 &  #endif &  }&
  因为#define 放在了真实代码后面,所以下面的例子是非法的:    #define&A &  namespace&N &  { &  #define&B &  #if&B &  class&Class1 &  #endif &  }&
  以上介绍C#预处理
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&C#预处理的一个例子为什么有些代码是灰色的解决办法 - C#当前位置:& &&&C#预处理的一个例子为什么有些代码是灰色的解决办法C#预处理的一个例子为什么有些代码是灰色的解决办法&&网友分享于:&&浏览:27次C#预处理的一个例子为什么有些代码是灰色的#define DEBUG#define SPECIALusing Susing System.Collections.Gusing System.Lusing System.Tnamespace ConsoleApplication7{ &
class Program &
static void Main() &
{#if (DEBUG && !SPECIAL) &
Console.WriteLine(&DEBUG符号已定义。&);
-------此行灰色#elif (!DEBUG && SPECIAL) &
Console.WriteLine(&SPECIAL符号已定义。&);
-------此行灰色#elif (DEGUB && SPECIAL) &
Console.WriteLine(&DEBUG和SPECIAL符号已定义。&);
-------此行灰色#else &
Console.WriteLine(&DEBUG和SPECIAL符号没有定义。&);#endif &
}}求解------解决方案--------------------#if (DEBUG && !SPECIAL)是调试模式执行吧
------解决方案--------------------因为在当前编译配置下,这些代码不会被编译。你可以在项目-设置-活动方案-预定义符号中改变。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 c语言编译预处理 的文章

 

随机推荐