【问题标题】:Integer values in compile time编译时的整数值
【发布时间】:2012-07-01 14:45:08
【问题描述】:

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

#define MESSAGE_FIRST 0

在其他文件中:

#define MESSAGE_ANOTHER 1

有什么方法可以在编译时自动获取该 id?比如:

#define MESSAGE_AUTO GetNextId()

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

谢谢。

附言海合会、Linux

【问题讨论】:

  • 该标准没有类似 __COUNTER__(类似于 __LINE__)AFAIK 的内容。 p.s.在我自己的预处理器中,我有这个。
  • 我想不出除了外部代码生成之外的任何方法。但也许如果您对您要解决的实际问题进行更全面的描述,我们可以为您提供更好的解决方案。
  • 它们必须在不同的文件中吗?或者它们都可以包含一个包含这些值的头文件吗?
  • 对这种文件交叉编译时计数器的需求听起来像是一个设计缺陷。

标签: c++ enums compile-time


【解决方案1】:

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

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。

【讨论】:

    【解决方案2】:

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

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

    另一种选择是使用枚举:

    enum {
        FIRST = 0,
        SECOND,
        THIRD
    };
    

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

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

    【讨论】:

    • 最新提示怎么样:当一切都是一个文件时,这很有用,我需要不同的文件并且一些程序员会编辑此代码,因此可能会发生冲突。
    • 在定义 SECOND 和 THIRD 时请使用括号。
    猜你喜欢
    • 2010-12-26
    • 2012-08-07
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多