c#预处理指令分析
预处理指令
这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面;列如,可以让编译器不编译某一部分代码等。
C#中主要的预处理指令
#define和#undef
#define指令定义:
#defineDEBUG
它告诉编译器存在DEBUG这个符号;这个符号不是实际代码的一部分,而只是在编译器编译代码时候可能会根据这个符号做条件编译。
#undef定义:
#undefDEBUG
用来移除定义的符号DEBUG。如果不存在这样的标记,#undef指令则不会生效。同样,用#define再次定义一个同名的标记也不会有任何变化。
注意:
- 你需要将#define和#undef指令写在实际业务代码开始之前的位置。
- #define本身没有什么用,需要和其他预处理器指令结合使用;比如#if
#if,#elif,#else和#endif
这些指令告诉编译器是否要编译包含在其中的代码块。例如:
intDoSomeWork(doublex) { //dosomething #ifDEBUG Console.WriteLine($"xis{x}"); #endif }
这段代码中的Console.Writeline语句,只有在前面用#define指令定义了符号DEBUG后才会在编译的时候,真正被编译到;
如果编译器没发现DEBUG符号,就会在编译的时候忽略这句代码。
#elif(=elseif)和#else指令可以用在#if块中:
#defineENTERPRISE #defineW10 //furtheroninthefile #ifENTERPRISE //dosomething #ifW10 //somecodethatisonlyrelevanttoenterprise //editionrunningonW10 #endif #elifPROFESSIONAL //dosomethingelse #else //codefortheleanerversion #endif
#if和#elif还支持有限的一些逻辑操作符,你可以用使用!,==,!=和||等。
一个标记如果存在,则认为是true,如果没有定义,就认为是false,因此你也可以这样使用:
#ifW10&&(ENTERPRISE==false)//ifW10isdefinedbutENTERPRISEisn't
#warning和#error
当编译器遇到#warning的时候,会产生警告信息;
当编译器遇到#error的时候,会产生错误信息;
classProgram { staticvoidMain(string[]args) { #warningthisisawarningmessagewhichwillbeshownwhencompile Console.WriteLine("HelloWorld!"); #errorthisisaerrormessage,andwillbreakbuild } }
编译结果:
Program.cs(10,10):warningCS1030:#warning:'thisisawarningmessagewhichwillbeshownwhencompile'[/define_warning/define_warning.csproj]
Program.cs(14,8):errorCS1029:#error:'thisisaerrormessage,andwillbreakbuild'[/define_warning/define_warning.csproj]
1Warning(s)
1Error(s)
使用这些指令可以检查#define语句是不是做错了什么事,使用#warning可以提醒要做些事情:
#ifDEBUG&&RELEASE #error"You'vedefinedDEBUGandRELEASEsimultaneously!" #endif #warning"Don'tforgettoremovethislinebeforethebossteststhecode!" Console.WriteLine("*Ilovethisjob.*");
#region和#endregion
可以用来标识一段代码,在VisualStudio或其他能够识别的IDE里比较有用。
#regionMemberFieldDeclarations intx; doubled; Currencybalance; #endregion
#line
#line指令可以用来改变编译器输出警告和错误时相应的文件名和行号信息。这个实际中,用的可能会比较少。
主要是在用第三方包的时候,有时候会导致编译器报告的行号或文件名与实际不匹配。
#line可以用于还原这种匹配。
#line164"Core.cs"//Wehappentoknowthisisline164inthefileCore.cs, //beforetheintermediatepackagemanglesit. //lateron #linedefault//restoresdefaultlinenumbering
#pragma
#pragma指令可以用来终止或恢复某个指定编号到编译器警告。
与命令行选项不同,#pragma指令可以在类或方法级别实现。
例如:
classProgram { staticvoidMain(string[]args) { inti=0; Console.WriteLine("HelloWorld!"); } }
编译是会有warning:
Program.cs(9,17):warningCS0219:Thevariable'i'isassignedbutitsvalueisneverused[/define_warning/define_warning.csproj]
1Warning(s)
0Error(s)
从warning信息可以看出是warningCS0219,加入#pragma后就不会有warning了。
#pragmawarningdisableCS0219 publicclassProgram { staticvoidMain(string[]args) { inti=0; Console.WriteLine("HelloWorld!"); } } #pragmawarningrestoreCS0219
注意:warning的代码是区分大小写的,CS2019要大写,如果写成cs2019则没有用。
以上就是c#预处理指令分析的详细内容,更多关于c#预处理指令的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。