#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
。
相关文章:
- #ifdef和未声明的标识符
- C++ Macros #ifdef
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 更新 #ifdef 中的现有变量值?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 使用 #ifdef 时的多个定义
- 使用 [#define & #ifdef] 跨文件激活代码块
- 以下 OpenCV 源代码中是否存在错误?(#ifdef 没有 #else)
- 有C++标准库 ifdef 或 ifndef 预处理器指令吗?
- C++预处理器同时执行#ifdef和#ifndef
- SFINAE-based ifdef
- 我们可以在INI文件中使用 #ifdef 宏,或者我们如何限制INI文件中写入的设置的编译?
- #ifdef 宏与 -Wpedantic 和 "extra" 分号
- 在静态库中使用 #ifdef(C++,Eclipse CDT)
- 如何避免使用IFDEF使代码更具测试
- IFDEF块内部对功能的未定义引用
- 什么是通用运行时组件 #ifdef 适用于Windows(UWP)而不是iOS
- 将#elif与#ifdef一起使用合法吗
- 如何编写函数来替换 #ifdef 和 #endif 对
- #ifdef SWIG:什么时候考虑这种条件编译