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

e271p314:

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

#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由于宏扩展而无法工作,因此无法生成问题中的代码。我们被敬酒了吗?

还没!我们可以利用您的宏都不存在或字符串文字的事实。考虑以下:

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

我们在这里利用最老旧的语法来利用我们的老朋友。根据是否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)

... 这里!

在Coliru上实时观看

注意:Coliru代码段中包含针对GCC和Clang的警告禁用器,警告我们可怜的朋友最烦人的解析:(

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不知道索引值名称的情况下打印数组的值

在不知道键的情况下打印第一个值

在不知道记录的列名的情况下打印记录表类型的值

如何在不知道Ract Native中的键的情况下遍历json数组并打印值?

如何在不知道请求数量的情况下链接 Javascript ajax 请求。(节点)

在不知道其名称的情况下打印所有POST请求参数

在不知道列的情况下用PHP打印MySQL表

在不知道具体id的情况下获取data-*的值

在不知道列和行的情况下替换pandas Dataframe中的某些值

在不知道键的情况下查找字典值的类型

如何在不知道键/值类型的情况下测试接口{}是否为映射?

在编译时不知道密钥的情况下解码JSON值

在调用方法之前不知道最大值的情况下如何编程进度?

在不知道类型为opencv的情况下访问矩阵值

在不知道底层类型的情况下,如何从模板化父类取回值?

Firebase:Swift-在不知道父键的情况下查询子节点中的值

如何在不知道键的类型和值的类型的情况下遍历KeyValuePair的枚举

在不知道列类型的情况下将NULL值转换为“ UNKNOWN”

在不知道类名的情况下获取静态属性的值

在不知道名称的情况下扫描特定值的嵌套 json 响应

在不知道AWK中确切位置的情况下替换缺失值

在不知道键的情况下快速引用字典键和值

如何在不知道键的情况下提取对象每个值的返回类型

如何在不知道JSON值的情况下动态解析某些JSON?

在不知道值的情况下检查python中几个变量的不等式

AngularFire 2 在不知道 ID 的情况下访问值

在不知道密钥名称的情况下删除 FireBase 值

在不知道其键的情况下按值对嵌套字典列表进行排序 [Python]

如何在编译器不知道的情况下更改变量的值?