gpt4 book ai didi

c++ - 将 defined(X) 返回为 true 或 false 的宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:54 27 4
gpt4 key购买 nike

我想要一系列宏来替换下面的代码

#ifdef FOO
return true;
#else
return false;
#endif

用类似的东西

return MAGICLY_EXPANDING_IFDEFINED_MACRO(FOO);

您可以猜到,有很多 FOO,足以将 4 行缩减为 1 行会很酷。但实际上它会用一行替换一个怪物 switch 语句。

最佳答案

在 C++ 中,defined 的行为仅针对条件包含(#if#elif)指定。所以你不能以任何其他方式使用它。

(相关规则见标准16.1节)

但是,如果你想检测具体是#define 到空字符串的宏,你不需要defined(),你可以这样做:

#include <iostream>

/* this matches */
#define FOO

/* this will not */
#undef BAZ

/* nor will these */
#define BAR 0
//#define BAR 1

#define STRINGIZE(x) (#x)
#define EXPAND_IF_DEFINED(y) (!*STRINGIZE(y))

int main()
{
std::cout << +EXPAND_IF_DEFINED(FOO) << '\n'
<< +EXPAND_IF_DEFINED(BAR) << '\n'
<< +EXPAND_IF_DEFINED(BAZ) << '\n';
}

警告,-D 选项不会是空字符串。要处理这种情况,您可以使用类似

#define IS_MACRO_DEFINED_OR_ONE(y) (!*STRINGIZE(y) || '1'==*STRINGIZE(y))

一个更强的测试是

#define IS_MACRO_DEFINED_NOT_TO_ITSELF(y) strcmp(#y, STRINGIZE(y))

由于字面量是编译时常量,编译器可能会在编译期间将 strcmp 调用优化为常量 truefalse。您还可以制作一个 constexpr 版本的 strcmp 来使用。

关于c++ - 将 defined(X) 返回为 true 或 false 的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com