【问题标题】:"warning : missing terminating " character" in false condition“警告:在错误条件下缺少终止“字符”
【发布时间】:2017-04-10 11:02:22
【问题描述】:

我正在使用 gcc 在 VS2015 和 Xcode 上编译我的游戏引擎代码。
我为我的代码使用了许多编译器,只有 gcc 显示警告:

warning : missing terminating " character  

代码如下:

#if 1  
   ...  
#else  
  asm __volatile__("  
    some assembly code  
    ...  
  "::: );  
#endif

我知道最近的 gcc 不接受字符串中的新行,但我不知道为什么 gcc 预处理器会针对错误块发出警告。
我知道我的内联汇编的写作风格很旧,但它们处于错误的条件块中。我不想碰它们,因为它们太多了。
除了抑制所有警告外,如何避免在错误条件块中出现此警告?

编辑:
我用 Armcc、Vc++(2005,2008,2012,2013,2015) 和 clang 编译了我的代码。他们不会显示这种警告,只有 GCC 会。
如果警告是针对 TRUE 条件块中的代码的,我会修复它们。但此警告适用于不应评估的 FALSE 条件块。

【问题讨论】:

标签: gcc c-preprocessor warnings


【解决方案1】:

C 预处理器是字符串字面量感知。根据语言语法,字符串文字是预处理标记之一

preprocessing-token:
  header-name
  identifier
  pp-number
  character-constant
  string-literal
  punctuator
  each non-white-space character that cannot be one of the above

当然,这是完全可以预料的,否则预处理器将无法区分 MACRO_NAME"MACRO_NAME"(后者只是一个字符串)。

因此,您的字符串文字应该被正确格式化以进行预处理。我假设 GCC 看到第一个 " 并开始将序列解释为字符串文字,但随后放弃尝试(由于缺少终止 ")并将其归档在通用“不能是上述之一”类别下,伴随着警告,

您似乎假设条件包含在更高的预处理级别上工作,而不是将此类标记识别为字符串文字。这个假设是不正确的。预处理器别无选择,只能解析“禁用”的代码段。

【讨论】:

  • 感谢您的详细解释。我的问题是为什么只有 gcc 显示该警告而其他人没有。我一直在尝试尽可能多地删除警告,并且我想删除此警告。但如果我不能,我会保持原样。
  • @yhorimoto:警告是不规范的。 GCC 认为它值得警告,而 Clang(另一个例子)则不。
猜你喜欢
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多