c语言编译器剔除注释,C预处理程序是先删除注释还是扩展宏?

如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;

}

取决于您的编译器是否默认处理三元组(应该是编译器,但由于三元组几乎使运行它们的每个人都感到惊讶,因此某些编译器决定默认将其关闭),您可能会或可能不会得到想要的行为- 当然是任何行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值