在 #error 预处理器指令中带有撇号的警告
Warning with having apostrophe in #error preprocessor directive
如果我尝试编译一个文件(error_c11.cpp),其内容是:
#if 0
#error This shouldn't be a problem
#endif
使用命令行:
gcc error_c11.cpp
我收到以下警告(以及其他一些有关 main 的链接器错误):
error_c11.cpp:2:20: warning: missing terminating ' character
#error This shouldn't be a problem
相反,使用 clang
或 Visual Studio 编译相同的内容不会给出任何警告。这是 gcc
(使用 v4.9.3)中的错误,还是 '
字符在 #error
预处理器指令中不允许,而其他编译器更宽松?
#error
指令的语法是:
#
error
pp-tokens opt new-line
A pp-token 是预处理器令牌。只有当撇号是字符常量(或字符串文字,或可能是 header 名称)的一部分时,撇号才能出现在预处理器标记中。
#error
之后的标记不必在语法上正确,但它们必须是有效的标记。
解决方法:
#if 0
#error "This shouldn't be a problem"
#endif
你甚至可以这样写:
#if 0
#error This shouldn't be a problem, m'kay?
#endif
在那种情况下,'t be a problem, m'
被视为一个 multi-character 常量,这是无稽之谈,但在这种情况下是合法的。
(题外话:将 C 预处理器应用于 Ada 代码的尝试 运行 遇到了类似的问题,因为 Ada 使用单个撇号来引入属性或限定表达式。)
如果我尝试编译一个文件(error_c11.cpp),其内容是:
#if 0
#error This shouldn't be a problem
#endif
使用命令行:
gcc error_c11.cpp
我收到以下警告(以及其他一些有关 main 的链接器错误):
error_c11.cpp:2:20: warning: missing terminating ' character
#error This shouldn't be a problem
相反,使用 clang
或 Visual Studio 编译相同的内容不会给出任何警告。这是 gcc
(使用 v4.9.3)中的错误,还是 '
字符在 #error
预处理器指令中不允许,而其他编译器更宽松?
#error
指令的语法是:
#
error
pp-tokens opt new-line
A pp-token 是预处理器令牌。只有当撇号是字符常量(或字符串文字,或可能是 header 名称)的一部分时,撇号才能出现在预处理器标记中。
#error
之后的标记不必在语法上正确,但它们必须是有效的标记。
解决方法:
#if 0
#error "This shouldn't be a problem"
#endif
你甚至可以这样写:
#if 0
#error This shouldn't be a problem, m'kay?
#endif
在那种情况下,'t be a problem, m'
被视为一个 multi-character 常量,这是无稽之谈,但在这种情况下是合法的。
(题外话:将 C 预处理器应用于 Ada 代码的尝试 运行 遇到了类似的问题,因为 Ada 使用单个撇号来引入属性或限定表达式。)