编译时的整数值

时间:2012-06-30 07:50:44

标签: c++ enums compile-time

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

#define MESSAGE_FIRST 0

在其他文件中:

#define MESSAGE_ANOTHER 1

在编译时自动获取该ID的任何方法?类似的东西:

#define MESSAGE_AUTO GetNextId()

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

感谢。

P.S。 GCC,Linux

2 个答案:

答案 0 :(得分:5)

您可以使用继承和函数重载来执行编译时计数器:

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>);

您可以在行动here中看到它。也适用于msvc。

答案 1 :(得分:1)

你说你正在使用GCC。 GCC有一个名为__COUNTER__的(AFAIK per-file)宏,每次使用后递增1。

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

另一种选择是使用枚举:

enum {
    FIRST = 0,
    SECOND,
    THIRD
};

或者您可以使用这样的预处理程序指令手动执行此操作:

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