c – 检查整数常量在编译时具有不同的值

我的问题如下.我有大量的静态const整数作为标识符.出于这个原因,我想知道是否有可能在编译时检查是否存在多个具有相同值的常量(某种静态断言…).

我不想使用枚举,因为这些常量是在不同的模块中定义的,我不希望有一个很长的枚举与所有这些(并且其中一些不相互关联).

这里有一个基本的例子:

// module: foo.h
const uint32_t ELEMENT_TYPE_FOO_X = 46;
const uint32_t ELEMENT_TYPE_FOO_Y = 51;
...

// module: boo.h
const uint32_t ELEMENT_TYPE_BOO_C = 21;
const uint32_t ELEMENT_TYPE_BOO_D = 51;

错误:ELEMENT_TYPE_FOO_Y和ELEMENT_TYPE_BOO_D具有相同的值.

我根本不是专家,我想到的唯一能够检测到这个错误的是模板专业化.

template<uint32_t N>
struct element_traits {
};

template<ELEMENT_TYPE_FOO_X> {
    enum { value = ELEMENT_TYPE_FOO };
};

但它似乎是一个复杂的解决方案.我不知道是否有更优雅/更好的解决方案.到目前为止我还没有找到任何东西.

提前致谢.

解决方法:

你当然可以使用宏来做到这一点:

#define UNIQUE_CONSTANT(variable, value) \
  const uint32_t variable = value; \
  bool constant_val_##value = value;

如果两次使用相同的值,则会出现多重定义错误.

(从技术上讲,这将在链接时检测错误,而不是编译时间.)

上一篇:java – 是否可以编译String代码?


下一篇:c – 如何将提升链接到我的程序?