c – 带有多个令牌的#ifdef,这是合法的吗?

前端之家收集整理的这篇文章主要介绍了c – 带有多个令牌的#ifdef,这是合法的吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天我遇到了一些包含#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.

猜你在找的C&C++相关文章