我正在使用GCC在Visual Studio 2015和Xcode上编译游戏引擎代码。
我为我的代码使用了许多编译器,只有GCC显示警告:
警告:缺少终止字符
代码如下:
#if 1
...
#else
asm __volatile__("
some assembly code
...
"::: );
#endif
我知道最近的GCC不接受字符串中的新行,但我不知道为什么GCC预处理器会对错误块发出警告。
我知道我的内联汇编的编写风格很旧,但它们在一个假条件块中。我不想碰它们,因为有太多了。
除了抑制所有警告之外,我如何在false条件块中避免此警告?
我用Armcc、Microsoft Visual C++(2005、2008、2012、2013和2015)和Clang编译了我的代码。它们不会发出这种警告只有GCC可以。
如果警告是针对TRUE条件块中的代码,我将修复它们。但是这些警告是针对FALSE条件块的,不应该对其进行评估。
1条答案
按热度按时间wvyml7n51#
C预处理器是 string-literal aware。根据语言语法,字符串文字是预处理标记之一
当然,这是完全可以预期的,因为否则预处理器将无法区分
MACRO_NAME
和"MACRO_NAME"
(后者只是一个字符串)。出于这个原因,为了预处理的目的,字符串文字应该被正确地格式化。我假设GCC看到了第一个
"
,并开始将该序列解释为字符串文字,但随后放弃了尝试(由于缺少终止"
),并将其归档在通用的“不能是上述之一”类别下,并附带一个警告。您似乎在假设条件包含在比识别字符串文字等标记更高的预处理级别上工作。这种假设是不正确的。预处理器没有其他选择,只能解析代码的“禁用”部分。