#ifdef 有多个代币,这合法吗?

#ifdef with multiple tokens, is this legal?

本文关键字:#ifdef      更新时间:2023-10-16

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

#ifdef DISABLE_UNTIL OTHER_CODE_IS_READY
   foo();
#endif

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

我的问题是,这是合法的C++法典吗? (g++ 编译它没有任何错误,它显然只是忽略了第二个标记)。 如果它是合法的,第二个代币应该有任何影响吗?

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

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

#if defined(DISABLE_UNTIL) || defined(OTHER_CODE_IS_READY)
    foo();
#endif

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

IF-组
# if常量表达式换行选项
# ifdef标识符选项
# ifndef标识符选项

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

海湾合作委员会自己的文件同意。

我自己的测试表明,只接受第一个识别者,第二个被简单地丢弃;这可能是为了简化实现,但标准确实需要在这里进行诊断,所以当你使用-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

科利鲁安装的GCC发出它有或没有-pedantic