1
30
不幸的是,原版 ANSI C Specification 专门排除第4节中的任何预处理器功能(“本规范仅描述C语言)。它没有为库或预处理器做任何设置。“)。 这个 C99 specification 不过,要明确处理这个问题。在“翻译阶段”,注释被替换为一个空格,这发生在预处理指令解析之前。(详见第6.10节)。 VC++ 以及 GNU C Compiler 两者都遵循这种模式——如果其他编译器更老,那么它们可能不兼容,但是如果它兼容C99,那么您应该是安全的。 |
2
10
如上所述 this copy-n-pasted decription 在c99标准中的翻译阶段中,删除注释(它们被单个空白替换)发生在翻译阶段3中,而预处理指令在阶段4中被处理和宏扩展。 在C90标准中(我只有硬拷贝,所以没有拷贝-粘贴),这两个阶段以相同的顺序出现,尽管翻译阶段的描述在某些细节上与C99标准略有不同-在处理预处理指令之前,注释被删除并替换为单个空白字符D和宏的展开没有什么不同。 同样,C++标准有这2个阶段以相同的顺序发生。
至于
C++标准表示:(2.7):
所以你的第一个例子很明显是那个译者的一个错误。
但是,由于您面临一个错误的转换器,您可能需要将宏定义更改为:
解决这个问题。 但是(我正在偏离主题…),因为在处理注释之前就发生了行拼接(换行前的反斜杠),所以您可能会遇到类似这样的讨厌代码:
这可能会让写它的人感到惊讶。 或者更棒的是,尝试以下由某人(当然不是我)写的内容!喜欢框式评论的人:
取决于编译器是否默认为处理 trigraphs 或者没有(编译器应该这样做,但是由于三角图让几乎所有运行它们的人都感到惊讶,一些编译器默认情况下决定关闭它们),您可能会得到或者可能不会得到您想要的行为——当然,不管是什么行为。 |
4
4
不要在宏中添加//注释。如果必须添加注释,请使用/**/。此外,宏中还有一个错误:
这样,foo的使用总是安全的。例如:
无论某个表达式是否定义了foo,都不会引发编译器错误。 |
5
2
|
6
1
我似乎记得,合规需要三个步骤:
这与编译器能够直接接受.i文件有关。 |
Jean-Francois T. · C(C99)中嵌套函数调用的限制 6 年前 |
Tarun Maganti · 字符串在C中是如何工作的? 7 年前 |
Mushy · 另一个空洞的话题;我只是想问一下,因为我很困惑 7 年前 |
Rahul · 编译器如何在编译时不知道内存大小的情况下分配内存? 7 年前 |
Sam · 将十六进制转换为循环中的一个字符串 7 年前 |
Dror K. · 用%p打印空指针是未定义的行为? 7 年前 |
lvella · 这个代码有效吗?[已关闭] 8 年前 |