【问题标题】:C++ compile time counter in macros宏中的 C++ 编译时间计数器
【发布时间】:2014-11-21 12:08:28
【问题描述】:

我正在尝试以遵循 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 预处理器计数器。

【问题讨论】:

  • 请使用外部程序生成代码。无论 COUNTER 是否可能,没有人能够理解此代码。当有人想在他们的 IDE 中找到 THIRD 的值时,他们会看到 MAKE_BOTH(ENUM)... 这没有帮助。
  • 请注意,__COUNTER__ 是一个 GCC 扩展,可在其 cppClang/LLVM 中使用。所以你使用它是相当安全的,你可能无法更换它......
  • @Barry:我不同意。我已经看过这种技术很多次了(没有计数器 - 如果需要,数字只是简单地包括在内)并且会或多或少地认为它很常见。
  • 使用 COUNTER 的可能缺点是它可能在之前的某些包含文件中使用过,因此 COUNTER 可以从不需要 0 的任意值开始

标签: c++ boost macros enums


【解决方案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,

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 2015-01-14
    • 2012-08-19
    • 2017-08-15
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多