今天我遇到了一些包含#ifdef子句的C代码,如下所示:
#ifdef DISABLE_UNTIL OTHER_CODE_IS_READY foo(); #endif
请注意“DISABLE_UNTIL”和“OTHER_CODE_IS_READY”之间的空格.基本上#ifdef行中指定了两个标记.
我的问题是,这是合法的C代码吗? (g编译它没有任何错误,它显然只是忽略了第二个标记).如果它是合法的,第二个令牌是否会产生任何影响?
解决方法
[C 11 16.1],[C 11 16.5],顺便提一下,[C99 6.10.1 / 4]都说这是无效的.
if-group:
# if
constant-expression new-line groupopt
# ifdef
identifier new-line groupopt
# ifndef
identifier new-line groupopt
只有一个标识符是合法的.
GCC自己的文档agrees.
My own tests建议只接受第一个标识符,然后丢弃第二个标识符;这可能是为了简化实现,但标准确实需要在这里进行诊断,所以当你至少使用-pedantic标志时你应该看到这个.
#include <iostream> using namespace std; #define A #define B int main() { #ifdef A std::cout << "a "; #endif #ifdef B std::cout << "b "; #endif #ifdef C std::cout << "c "; #endif #ifdef B C std::cout << "bc "; #endif #ifdef C B std::cout << "cb "; #endif return 0; } // Output: "a b bc" // Note: "cb" *not* output
†Coliru安装的GCC发射它with or without -pedantic
.