#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 预处理器指令中带有撇号的警告的主要内容,如果未能解决你的问题,请参考以下文章