编译时中的整数值

Integer values in compile time

本文关键字:整数 编译      更新时间:2023-10-16

我必须在具有一些整数ID的不同文件中写入一些常量。例如:

#define MESSAGE_FIRST 0

在其他文件中:

#define MESSAGE_ANOTHER 1

有什么方法可以在编译时自动获取该 id?像这样:

#define MESSAGE_AUTO GetNextId()

我不能在这里使用枚举,因为此指令将位于不同的文件中。

谢谢。

p.s. GCC, Linux

你可以做一个编译时计数器,继承和函数重载:

template<unsigned int n> struct Count { bool data[n]; };
template<int n> struct Counter : public Counter<n-1> {};
template<> struct Counter<0> {};
Count<1> GetCount(Counter<1>);
#define MAX_COUNTER_NUM 64
#define COUNTER_VALUE (sizeof(GetCount(Counter<MAX_COUNTER_NUM + 1>())) / sizeof(bool))
#define INC_COUNTER Count<COUNTER_VALUE + 1> GetCount(Counter<COUNTER_VALUE + 1>);

你可以在这里看到它的实际效果。也适用于 msvc。

你说你正在使用GCC。GCC 具有称为 __COUNTER__的(AFAIK 每个文件)宏,每次使用后递增 1。

请注意,这是一个扩展,不包含在标准C++中。

另一种选择是使用枚举:

enum {
    FIRST = 0,
    SECOND,
    THIRD
};

或者,您可以使用预处理器指令手动执行此操作,如下所示:

#define FIRST 0
#define SECOND (1 + FIRST)
#define THIRD (1 + SECOND)