繁体   English   中英

为什么使用Visual Studio而不是GCC进行编译时不会出现错误?

[英]Why does this compile without an error with Visual Studio and not GCC?

您知道为什么在Visual Studio(2012)而不是GCC 4.7.2中不会出现错误地进行编译吗?

我正在棘手的源文件上运行一些编译器测试。 根据此处接受的答案,GCC不应出错(错误:/令牌之前的预期表达式):删除紧跟换行符的任何反斜杠字符()以及换行符。 因此,这等效于行拼接,应预处理为单行。

#include                                        \
                                                \
    "my_header_\
file_example.h" /* this is a long trailing\
                comment */

如果实际上在\\之后紧跟着行尾,则源代码正确,并且应由兼容的编译器接受。 C99语言的草案在5.1.1.2转换阶段中说:

§2: 删除紧跟换行符的每个反斜杠字符( \\ )实例,将物理源代码行拼接成逻辑源代码行。 只有任何物理源代码行上的最后一个反斜杠才有资格成为此类接头的一部分。 不为空的源文件应以换行符结尾,在进行任何此类拼接之前,不得在其后立即加上反斜杠字符。

这实际上发生在预处理器执行任何#include 之前的阶段2中因此应根据标准接受它:

§4: 执行预处理指令,扩展宏调用,并执行_Pragma一元运算符表达式。 如果通过标记串联(6.10.3.3)产生了与通用字符名的语法匹配的字符序列,则该行为未定义。 #include预处理指令使命名的标头或源文件从阶段1到阶段4进行递归处理。

但是,如果\\与行尾之间有空格,则§2的操作将不会发生,并且会出现错误。

在宏中忽略反斜杠/换行符组合是正确的(宏继续)。 但是,这发生在字符串中。 反斜杠后面不跟n或其他定义的转义字母,而是跟0x0d0x0a ,然后将其按字面意义放入字符串中。 因此,它尝试打开的文件类似于my_header_0x0dfile_example.h

顺便说一句,很有趣地知道它带来的错误。 正如我在上面所怀疑的那样,它抱怨找不到文件,而不是“字符串文字中的非法'\\'”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM