6

今天我遇到了一些包含如下 #ifdef 子句的 C++ 代码:

#ifdef DISABLE_UNTIL OTHER_CODE_IS_READY
   foo();
#endif

请注意“DISABLE_UNTIL”和“OTHER_CODE_IS_READY”之间的空格。本质上,#ifdef 行中指定了两个标记。

我的问题是,这是合法的 C++ 代码吗?(g++ 编译它没有任何错误,它显然只是忽略了第二个标记)。如果是合法的,第二个令牌应该有什么作用吗?

4

2 回答 2

13

您发布的语法不合法,预期含义不清楚。

根据您希望完成的任务,您可以使用||&&组合它们吗?
(当然,如果这是别人的代码,我会以不合适/不可用而拒绝它)

#if defined(DISABLE_UNTIL) || defined(OTHER_CODE_IS_READY)
    foo();
#endif
于 2013-10-11T15:35:27.267 回答
6

[C++11 16.1][C++11 16.5]顺便说一句,[C99 6.10.1/4]所有人都说这是无效的。

if-group :
# if 常量表达式 换行 选择
# ifdef 标识符 换行 选择
# ifndef 标识符 换行 选择

只有一个标识符是合法的。

GCC 自己的文档同意.

我自己的测试表明,只有第一个标识符被接受,第二个被简单地丢弃;这可能是为了简化实施,但标准确实需要在此处进行诊断,因此当您-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 会在有或没有-pedantic.

于 2013-10-11T15:33:29.763 回答