“警告:错误终止”字符“处于错误状态

时间:2016-11-26 05:23:46

标签: gcc c-preprocessor warnings

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

warning : missing terminating " character  

代码如下:

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

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

编辑:
我用Armcc,Vc ++(2005,2008,2012,2013,2015)和clang编译了我的代码。他们没有表现出这种警告,只有海湾合作委员会这样做 如果警告是针对TRUE条件块中的代码,我将修复它们。但是这个警告是针对不应该评估的FALSE条件块。

1 个答案:

答案 0 :(得分:0)

C预处理器是 string-literal aware 。根据语言语法,字符串文字是预处理标记之一

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看到第一个"并开始将序列解释为字符串文字,但随后放弃尝试(由于缺少终止")并将其归档于通用“不能是其中之一以上“类别,附带警告,

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