更新4: 正如@Alex Bakanov所指出的,您不能在扩展宏时使用#ifdef
,因此没有一种适用于所有情况的单行解决方案。尽管如此,我希望我在这里写的想法可能会有用。
如果您使用#define FOO 1
或#define FOO 0
,则可以使用#define
和if constexpr
的组合。请注意,如果未定义FOO
,则会出现错误。此程序将返回1:
#include<iostream>
#define FOO 1
#define MY_IFDEF(x,y) if constexpr (x) y;
int main()
{
int bar =0;
MY_IFDEF(FOO,bar++)
std::cout << bar << "\n";
}
更新:根据@eerorika的评论,为了避免如果未定义FOO
而出现错误,必须添加以下声明:
constexpr bool FOO = false;
更新2:这个版本在任何情况下都可以工作,唯一的问题是它是否值得努力?
#ifdef FOO
constexpr bool USED_FOO = true;
#else
constexpr bool USED_FOO = false;
#endif
#define MY_IFDEF(x,y) if constexpr (USED_##x) y ;
更新3:兼容C语言版本。请注意,理论上在这种情况下它是在运行时而非编译时进行评估,但编译器将意识到它始终为真/假并相应地生成代码:
#ifdef FOO
const static bool USED_FOO = true;
#else
const static bool USED_FOO = false;
#endif
#define MY_IFDEF(x,y) if (USED_##x) y;
#ifdef
;扩展不会被扫描条件。 - Nate Eldredge#undef
是什么。 - Алексей Неудачин