在#error预处理程序指令中有撇号的警告

Mue*_*ito 3 c++ c-preprocessor

如果我尝试编译一个文件(error_c11.cpp),其内容是:

 #if 0
 #error This shouldn't be a problem
 #endif
Run Code Online (Sandbox Code Playgroud)

使用命令行:

gcc error_c11.cpp
Run Code Online (Sandbox Code Playgroud)

我收到以下警告(然后是关于main的一些其他链接器错误):

error_c11.cpp:2:20: warning: missing terminating ' character
 #error This shouldn't be a problem
Run Code Online (Sandbox Code Playgroud)

相反,使用clangVisual Studio 编译相同内容并不会发出任何警告.这是gcc(使用v4.9.3)中的错误,或者,预处理程序指令中'不允许使用哪些字符#error,而其他编译器更宽松?

Kei*_*son 5

#error指令的语法是:

# error pp-tokens 选择 新线

PP-令牌是一个预处理器令牌.只有当撇号是字符常量(或字符串文字,或可能是标题名称)的一部分时,它才会出现在预处理程序令牌中.

后面的标记#error不必在语法上正确,但它们必须是有效的标记.

解决方法:

#if 0
#error "This shouldn't be a problem"
#endif
Run Code Online (Sandbox Code Playgroud)

你甚至可以写:

#if 0
#error This shouldn't be a problem, m'kay?
#endif
Run Code Online (Sandbox Code Playgroud)

在这种情况下,'t be a problem, m'被视为多字符常量,这在这种情况下是无稽之谈但是合法的.

(一个题外话:尝试将C预处理器应用于Ada代码遇到了类似的问题,因为Ada使用单个撇号来引入属性或限定表达式.)