我正在使用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条件块。
答案 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看到第一个"
并开始将序列解释为字符串文字,但随后放弃尝试(由于缺少终止"
)并将其归档于通用“不能是其中之一以上“类别,附带警告,
您似乎假设条件包含在较高的预处理级别上工作,而不是将此类标记识别为字符串文字。这个假设是不正确的。预处理器别无选择,只能解析代码的“禁用”范围。