#error 预处理器指令中带有撇号的警告

Posted

技术标签:

【中文标题】#error 预处理器指令中带有撇号的警告【英文标题】:Warning with having apostrophe in #error preprocessor directive 【发布时间】:2016-05-12 18:43:17 【问题描述】:

如果我尝试编译一个文件(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 pp-tokens newline,其中pp-tokens是一个或多个preprocessing-token,其中包括 character-literal。我可以看到这是无效的语法。 嗯,这实际上是一个警告。似乎即使是 c 预处理器也倾向于在静态代码分析上使用 AI 功能。 尝试将您的信息放在双引号中。 @KirillKobelev,使用 Clang 进行测试,导致错误引用错误消息,这并不理想,但很接近。 【参考方案1】:

#error 指令的语法是:

# error pp-tokensopt换行

pp-token 是一个预处理器令牌。只有当它是字符常量(或字符串文字,或可能是标头名称)的一部分时,撇号才能出现在预处理器标记中。

#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' 被视为一个多字符常量,在这种情况下这是无稽之谈但合法。

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

【讨论】:

这让我觉得应该是 cppreference.com 上的那种东西,它所说的只是"error_message can consist of several words not necessarily in quotes." 在得到这个答案之前我必须做一些搜索,因为我想知道是否引用应该受到青睐,这似乎是一个坚实的论据。可悲的是,引用与多行错误消息混为一谈,您需要用反斜杠将其打破,因为您让每个字符串都有自己的引号......我不乐观认为有解决方法。 :-/

以上是关于#error 预处理器指令中带有撇号的警告的主要内容,如果未能解决你的问题,请参考以下文章

预处理器和使用关联

将带撇号的变量传递给 SQL 查询

预处理器指令#error: 'DEBUG 已定义'

将带撇号的 json 值发送到 Web 服务时出现无效对象错误

HTML属性可以有撇号吗

修复取决于预处理器条件的“-Wunused-parameter”警告