gpt4 book ai didi

c++ - 在不知道宏数量的情况下打印宏值

转载 作者:IT老高 更新时间:2023-10-28 12:42:53 28 4
gpt4 key购买 nike

我的代码包含一个生成的文件(我事先不知道它的内容),我和我的用户就如何创建这个文件达成了一个约定,以便我可以使用它。这个文件看起来像

#define MACRO0 "A"
#define MACRO1 "B"
#define MACRO2 "C"
...

我想打印所有的宏值。我当前的代码看起来像

#ifdef MACRO0
std::cout << "MACRO0 " << MACRO0 << std::endl;
#endif
#ifdef MACRO1
std::cout << "MACRO1 " << MACRO1 << std::endl;
#endif
#ifdef MACRO2
std::cout << "MACRO2 " << MACRO2 << std::endl;
#endif

我的问题是,如何迭代生成文件中的宏,这样我就不需要重复我的代码了

最佳答案

首先,我们知道我们可以依靠 Boost.Preprocessor 来满足我们的循环需求。但是,生成的代码必须独立运行。不幸的是,由于宏扩展, #ifdef 无法工作,因此无法在您的问题中生成代码。我们 toast 了吗?

还没有!我们可以利用这样一个事实,即您的宏要么都不存在,要么都是字符串文字。考虑以下几点:

using StrPtr = char const *;
StrPtr probe(StrPtr(MACRO1));

我们正在利用我们的老 friend 这里最令人烦恼的解析。根据是否定义了MACRO1,可以用两种方式解释第二行。没有它,就相当于:

char const *probe(char const *MACRO1);

... 这是一个函数声明,其中 MACRO1 是参数的名称。但是,当 MACRO1 被定义为 "B" 时,它就等同于:

char const *probe = (char const *) "B";

... 这是一个初始化为指向 "B" 的变量。然后我们可以打开我们刚刚生成的类型来查看是否发生了替换:

if(!std::is_function<decltype(probe)>::value)
std::cout << "MACRO1 " << probe << '\n';

我们可以在这里使用if constexpr,但是std::cout可以输出一个函数指针(它将它转换为bool)所以死分支是有效的,编译器足够聪明,可以完全优化它。

最后,我们回到 Boost.Preprocessor 为我们生成所有这些东西:

#define PRINT_IF_DEFINED(z, n, data) \
{ \
StrPtr probe(StrPtr(BOOST_PP_CAT(MACRO, n))); \
if(!std::is_function<decltype(probe)>::value) \
std::cout << "MACRO" BOOST_PP_STRINGIZE(n) " " << probe << '\n'; \
}

#define PRINT_MACROS(num) \
do { \
using StrPtr = char const *; \
BOOST_PP_REPEAT(num, PRINT_IF_DEFINED, ~) \
} while(false)

...瞧!

See it live on Coliru

注意:Coliru 代码段包括 GCC 和 Clang 的警告禁用程序,它警告我们可怜的 friend 最烦人的解析:(

关于c++ - 在不知道宏数量的情况下打印宏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452953/

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