- 讲师:刘萍萍 / 谢楠
- 课时:160h
- 价格 4580 元
特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关
配套通关班送国网在线题库一套
条件编译指令用于按条件包含或排除源文件中的某些部分。
按照语法的规定,条件编译指令必须写成集的形式,集的组成依次为:一个 #if
指令、一个或多个 #elif
指令(或没有)、一个或多个 #else
指令(或没有)和一个 #endif
指令。指令之间是源代码的条件节。每节代码直接位于它前面的那个指令控制。条件节本身可以包含嵌套的条件编译指令,前提是这些指令构成完整的指令集。
“pp 条件”最多只能选择一个它所包含的“条件节”去做通常的词法处理:
选定的“条件节”(若有)按正常的“输入节”处理:节中包含的源代码必须符合词法文法;从节中的源代码生成标记;节中的预处理指令具有规定的效果。
剩余的“条件节”(若有)按“跳过节”处理:除了预处理指令,节中的源代码不必一定要符合词法文法;不从节中的源代码生成任何词法标记;节中的预处理指令必须在词法上正确,但不另外处理。在按“跳过节”处理的“条件节”中,任何嵌套的“条件节”(包含在嵌套的 #if
...#endif
和#region
...#endregion
构造中)也按“跳过节”处理。
下面的示例阐释如何嵌套条件编译指令:
#define Debug // Debugging on #undef Trace // Tracing off class PurchaseTransaction { void Commit() { #if Debug CheckConsistency(); #if Trace WriteToLog(this.ToString()); #endif #endif CommitHelper(); } }
除预处理指令外,跳过的源代码与词法分析无关。例如,尽管在 #else
节中有未结束的注释,但下面的示例仍然有效:
#define Debug // Debugging on class PurchaseTransaction { void Commit() { #if Debug CheckConsistency(); #else /* Do something else #endif } }
但请注意,即使是在源代码的跳过节中,也要求预处理指令在词法上正确。
当预处理指令出现在多行输入元素的内部时,不作为预处理指令处理。例如,程序:
class Hello { static void Main() { System.Console.WriteLine(@"hello, #if Debug world #else Nebraska #endif "); } }
输出结果为:
hello, #if Debug world #else Nebraska #endif
在特殊的情况下,如何处理预处理指令集可能取决于 pp 表达式的计算。示例:
#if X /* #else /* */ class Q { } #endif
总是产生同样的标记流 (class
Q
{
}
),不管是否定义了 X
。如果定义了 X
,由于多行注释的缘故,只处理 #if
和 #endif
指令。如果未定义 X
,则这三个指令(#if
、#else
、#endif
)是指令集的组成部分。
上一页 [1] [2]
责编:杨粟梅
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
点击加载更多评论>>