博文

C# 语言规范--2.5.7 行指令(2006-09-04 10:58:00)

摘要:行指令可用于改变编译器在输出(如警告和错误)中报告的行号和源文件名称。 行指令最通用于从某些其他文本输入生成 C# 源代码的元编程工具。 pp-line:(pp 行:) whitespaceopt   #   whitespaceopt   line   whitespace   line-indicator   pp-new-line(空白可选   #   空白可选   line   空白   行指示符   pp 新行) line-indicator:(行指示符:) decimal-digits   whitespace   file-name(十进制数字   空白   文件名) decimal-digits(十进制数字) default hidden file-name:(文件名:) "   file-name-characters   "("   文件名字符   ") file-name-characters:(文件名字符:) file-name-character(文件名字符)
file-name-characters   file-name-character(文件名字符   文件名字符) file-name-character:(文件名字符:) 除 " 外的任何输入字符 当不存在 #line 指令时,编译器在它的输出中报告真实的行号和源文件名称。#line 指令最通用于从某些其他文本输入生成 C# 源代码的元编程工具。当处理的 #line ......

阅读全文(1556) | 评论:0

C# 语言规范--2.5.6 区域指令(2006-09-04 10:57:00)

摘要:区域指令用于显式标记源代码的区域。 pp-region:(pp 区域:) pp-start-region   conditional-sectionopt   pp-end-region(pp 开始区域   条件节可选   pp 结束区域) pp-start-region:(pp 开始区域:) whitespaceopt   #   whitespaceopt   region   pp-message(空白可选   #   空白可选   region   pp 消息) pp-end-region:(pp 结束区域:) whitespaceopt   #   whitespaceopt   endregion   pp-message(空白可选   #   空白可选   endregion   pp 消息) 区域不具有任何附加的语义含义;区域旨在由程序员或自动工具用来标记源代码中的节。#region 或 #endregion 指令中指定的消息同样不具有任何语义含义;它只是用于标识区域。匹配的 #region 和 #endregion 指令可能具有不同的“pp 消息”。 区域的词法处理:#region ... #endregion 与以下形式的条件编译指令的词法处理完全对应:#if true ... #endif  ......

阅读全文(2165) | 评论:0

C# 语言规范--2.5.5 诊断指令(2006-09-04 10:53:00)

摘要:诊断指令用于显式生成错误信息和警告消息,这些信息的报告方式与其他编译时错误和警告相同。 pp-diagnostic:(pp 诊断:) whitespaceopt   #   whitespaceopt   error   pp-message(空白可选   #   空白可选   error   pp 消息)
whitespaceopt   #   whitespaceopt   warning   pp-message(空白可选   #   空白可选   warning   pp 消息) pp-message:(pp 消息:) new-line(新行)
whitespace   input-charactersopt   new-line(空白   输入字符可选   新行) 示例:#warning Code review needed before check-in #if Debug && Retail #error A build can't be both debug and retail #endif class Test {...} 总是产生一个警告(“Code review needed before check-in”),如果同时定义条件符号 Debug 和 Retail,则产生一个编译时错误(“A build can't be both debug and retail”)。注意 pp-message(pp 消息)可以包含任意文本;具体说来,它可以包含格式不正确的标记,比如“can't”中的单引......

阅读全文(1648) | 评论:0

C# 语言规范--2.5.4 条件编译指令(2006-09-04 10:50:00)

摘要:条件编译指令用于按条件包含或排除源文件中的某些部分。 pp-conditional:(pp 条件:) pp-if-section   pp-elif-sectionsopt   pp-else-sectionopt   pp-endif(pp if 节   pp elif 节可选   pp else 节可选   pp endif) pp-if-section:(pp if 节:) whitespaceopt   #   whitespaceopt   if   whitespace   pp-expression   pp-new-line   conditional-sectionopt(空白可选   #   空白可选   if   空白   pp 表达式   pp 新行   条件节可选) pp-elif-sections:(pp elif 节:) pp-elif-section(pp elif 节)
pp-elif-sections   pp-elif-section(pp elif 节   pp elif 节) pp-elif-section:(pp elif 节:) whitespaceopt   #   whitespaceopt   elif   whitespace   pp-expression &nbs......

阅读全文(2013) | 评论:0

C# 语言规范--2.5.3 声明指令(侍续)(2006-09-04 10:11:00)

摘要:声明指令用于定义或取消定义条件编译符号。 pp-declaration:(pp 声明:) whitespaceopt   #   whitespaceopt   define   whitespace   conditional-symbol   pp-new-line(空白可选   #   空白可选   define   空白   条件符号   pp 新行)
whitespaceopt   #   whitespaceopt   undef   whitespace   conditional-symbol   pp-new-line(空白可选   #   空白可选   undef   空白   条件符号   pp 新行) pp-new-line:(pp 新行:) whitespaceopt   single-line-commentopt   new-line(空白可选   单行注释可选   新行) 对 #define 指令的处理使给定的条件编译符号成为已定义的(从跟在指令后面的源代码行开始)。类似地,对 #undef 指令的处理使给定的条件编译符号成为未定义的(从跟在指令后面的源代码行开始)。 源文件中的任何 #define 和 #undef 指令都必须出现在源文件中第一个“标记”(第 2.4 节)的前面......

阅读全文(1707) | 评论:0

C# 语言规范--2.5.2 预处理表达式(2006-09-04 10:10:00)

摘要:预处理表达式可以出现在 #if 和 #elif 指令中。在预处理表达式中允许使用 !、==、!=、&& 和 || 运算符,并且可以使用括号进行分组。 pp-expression:(pp 表达式:) whitespaceopt   pp-or-expression   whitespaceopt(空白可选   pp 或表达式   空白可选) pp-or-expression:(pp 或表达式:) pp-and-expression(pp 与表达式)
pp-or-expression   whitespaceopt   ||    whitespaceopt   pp-and-expression(pp 或表达式   空白可选   ||   空白可选   pp 与表达式) pp-and-expression:(pp 与表达式:) pp-equality-expression(pp 相等表达式)
pp-and-expression   whitespaceopt   &&   whitespaceopt   pp-equality-expression(pp 与表达式   空白可选   &&   空白可选   pp 相等表达式) pp-equality-expression:(pp 相等表达式:) pp-unary-expression(pp 一元表达式)
pp-equality-expression   whitespaceopt ......

阅读全文(2100) | 评论:0

C# 语言规范--2.5.1 条件编译符号(2006-09-04 10:09:00)

摘要:#if、#elif、#else 和 #endif 指令提供的条件编译功能是通过预处理表达式(第 2.5.1 节)和条件编译符号来控制的。 conditional-symbol:(条件符号:) 除 true 和 false 外的任何标识符或关键字 条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。当处理 #define 指令时,在指令中指定的条件编译符号在那个源文件中成为已定义的。此后,该符号就一直保持已定义的状态,直到处理一条关于同一符号的 #undef 指令,或者到达源文件的结尾。这意味着一个源文件中的 #define 和 #undef 指令对同一程序中的其他源文件没有任何影响。 当在预处理表达式中引用时,已定义的条件编译符号具有布尔值 true,未定义的条件编译符号具有布尔值 false。不要求在预处理表达式中引用条件编译符号之前显式声明它们。相反,未声明的符号只是未定义的,因此具有值 false。 条件编译符号的命名空间与 C# 程序中的所有其他命名实体截然不同。只能在 #define 和 #undef 指令以及预处理表达式中引用条件编译符号。  ......

阅读全文(1785) | 评论:0

C# 语言规范--2.5 预处理指令(2006-09-04 10:09:00)

摘要:预处理指令提供按条件跳过源文件中的节、报告错误和警告条件,以及描绘源代码的不同区域的能力。使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致。在 C# 中没有单独的预处理步骤;预处理指令按词法分析阶段的一部分处理。 pp-directive:(pp 指令:) pp-declaration(pp 声明)
pp-conditional(pp 条件)
pp-line(pp 行)
pp-diagnostic(pp 诊断)
pp-region(pp 区域) 下面是可用的预处理指令: #define 和 #undef,分别用于定义和取消定义条件编译符号(第 2.5.3 节)。 #if、#elif、#else 和 #endif,用于按条件跳过源代码中的节(第 2.5.4 节)。 #line,用于控制行号(在发布错误和警告信息时使用)(第 2.5.7 节)。 #error 和 #warning,分别用于发出错误和警告(第 2.5.5 节)。 #region 和 #endregion,用于显式标记源代码中的节(第 2.5.6 节)。 预处理指令总是占用源代码中的单独一行,并且总是以 # 字符和预处理指令名称开头。# 字符的前面以及 # 字符与指令名称之间可以出现空白符。 包含 #define、#undef、#if、#elif、#else、#endif 或 #line 指令的源代码行可以用单行注释结束。在包含预处理指令的源行上不允许使用带分隔符的注释(/* */ 样式的注释)。 预处理指令既不是标记,也不是 C# 句法文法的组成部分。但是,可以用预处理指令包含或排除标记序列,并且可以以这种方式影响 C# 程序的含义。例如,编译后,程序:#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() {} } 因此,尽管上述两个程序在词法分析中完全不同,但它们在句......

阅读全文(1845) | 评论:0

C# 语言规范--2.4.5 运算符和标点符号(2006-09-04 10:08:00)

摘要:有若干种运算符和标点符号。运算符在表达式中用于描述涉及一个或多个操作数的运算。例如,表达式 a + b 使用 + 运算符添加两个操作数 a 和 b。标点符号用于分组和分隔。 operator-or-punctuator(运算符或标点符号):下列之一 {      }      [      ]      (      )      .      ,      :      ; +      -      *      /      %      &      |       ^      !      ~ =      <      >      ?      ++     ......

阅读全文(1895) | 评论:0

C# 语言规范--2.4.4.6 空文本(2006-09-04 10:07:00)

摘要: null-literal:(空文本:) null “空文本”的类型为 null 类型。  ......

阅读全文(1655) | 评论:0