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

时间:2014-11-21 12:08:29

标签: 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预处理器计数器。 / p>

1 个答案:

答案 0 :(得分:1)

您可以生成以下内容:

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,