宏中的 C++ 编译时间计数器

标签 c++ boost macros enums

我正在尝试以遵循 c++ 标准的方式实现以下目标:

#include <iostream>

using namespace std;



#define MAKE_BOTH(MAKE_FUNC) \
        MAKE_FUNC(FIRST) \
        MAKE_FUNC(SECOND) \
        MAKE_FUNC(THIRD) \
        MAKE_FUNC(FOURTH)

#define MAKE_STRINGS(NAME) #NAME,

const char* genericString[] {
        MAKE_BOTH(MAKE_STRINGS)
};

#define MAKE_ENUM(NAME) NAME = (1L << __COUNTER__),

enum genericEnum {
        MAKE_BOTH(MAKE_ENUM)

};



int main()
{
    cout << FIRST << endl;
    cout << SECOND << endl;
    cout << THIRD << endl;
    cout << FOURTH << endl;
}

如果您仔细考虑这段代码,它会同时创建枚举和由与枚举相同的名称组成的“字符串”数组。示例代码扩展为:

const char* genericString[] {
    "FIRST",
    "SECOND",
    "THIRD",
    "FOURTH"
};

enum genericEnum {
    FIRST = 1L << 0; (1)
    SECOND = 1L << 1; (2)
    THIRD  = 1L << 2; (4)
    FOURTH = 1L << 3; (8)
};

基本上,枚举被分配了 2 个值的幂,问题是 - 是否有一种相对简单的方法可以在不使用 COUNTER 的情况下实现同样的事情?

问题类似于这个: Counting preprocessor macros 但是每次在编译时使用宏时,我都必须增加计数器的值,如果不使用非标准的 COUNTER 宏,我不知道该怎么做。

请注意 c++ 11 不是一个选项,但使用 boost 是,我也尝试了 boost 方法,但不可能通过宏调用 #include 指令,这使我无法增加 boost 预处理器计数器。

最佳答案

你可能会生成这样的东西:

enum genericEnum
{

    MY_ENUM_BASE=0,

    FIRST,
    PAST_FIRST= (FIRST<<1)-1,

    SECOND,
    PAST_SECOND= (SECOND<<1)-1,

    THIRD,
    PAST_THIRD= (THIRD<<1)-1,

    FOURTH,
    PAST_FOURTH= (FOURTH<<1)-1,

};

使用标准宏处理器而不使用COUNTER, 即定义 MAKE_ENUM 为

#define MAKE_ENUM(NAME) NAME, PAST##_NAME= (NAME<<1)-1,

关于宏中的 C++ 编译时间计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27061071/

相关文章:

c++ - Windows Messaging - 捕获来自另一个 API 的调用

c++ - 自动更新 QDateTimeEdit 以显示当前系统日期和时间

boost - 如何在cmake中添加宏的定义?

rust - 如何通过宏获取声明的变量名和变量类型

c - 使用循环定义的宏

c++ - 如何获取可变参数宏中每个参数的名称?

c++ - 使用 Boost.GIL 创建图像

c++ - 在遇到用户创建的错误后,如何以编程方式强制编译器停止编译过程?

c++ - Linux: C++:/usr/bin/ld: 找不到 -llibboost_serialization

c++ - 使用cmake和vs2010链接到静态boost lib而不自动链接