如C99标准中翻译阶段的复制粘贴描述中所述,在翻译阶段3中会删除注释(用单个空格代替),而在预处理阶段中会处理预处理指令并扩展宏。
在C90标准中(我只有硬拷贝,所以没有copy-n-paste),这两个阶段以相同的顺序发生,尽管翻译阶段的描述在某些细节上与C99标准略有不同-事实上 在处理预处理指令和扩展宏之前,注释将被删除并由单个空格字符替换。
同样,C ++标准使这两个阶段以相同顺序发生。
至于应如何处理'2682425328404005005888'注释,C99标准对此表示为(6.4.9 / 2):
除了字符常量,字符串文字或注释内,字符// 引入一个注释,该注释包括直到(但不包括)所有多字节字符 下一个换行符。
C ++标准说(2.7):
字符//开始注释,并以下一个换行符结尾 字符。
因此,您的第一个示例显然是该翻译器的错误-扩展foo()宏时,应保留foo(a)之后的';'字符-注释字符不应成为the foo()宏的“内容”的一部分。
但是由于您遇到了一个有问题的翻译程序,因此您可能需要将宏定义更改为:
#define foo(x) /* junk */
解决该错误。
但是(由于我在讨论注释之前发生了行拼接(在换行符前加反斜杠)),所以(我在这里不讨论话题了),您可能会遇到这样的讨厌代码:
#define evil( x) printf( "hello "); // hi there, \
printf( "%s\n", x); // you!
int main( int argc, char** argv)
{
evil( "bastard");
return 0;
}
不管是谁写的,都可能会感到惊讶。
甚至更好,请尝试以下方法,这些方法是喜欢框式注释的某人(肯定不是我!)写的:
int main( int argc, char** argv)
{
//----------------/
printf( "hello "); // Hey, what the??/
printf( "%s\n", "you"); // heck?? /
//----------------/
return 0;
}
取决于您的编译器是否默认处理三元组(应该是编译器,但由于三元组几乎使运行它们的每个人都感到惊讶,因此某些编译器决定默认将其关闭),您可能会或可能不会得到想要的行为- 当然是任何行为。