3

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

我不想使用枚举,因为这些常量是在不同的模块中定义的,我不想让所有的枚举都像一个很长的枚举(其中一些彼此不相关)。

这里有一个基本示例:

// 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 };
};

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

提前致谢。

4

3 回答 3

6

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

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

然后,如果两次使用相同的值,您将收到多重定义错误。

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

于 2012-08-09T23:35:29.163 回答
0

基于基思的解决方案。我可以“检查”常量对于调试构建具有独特的价值,并在发布构建时跳过它。

#ifdef DEBUG
#define DEFINE_UNIQUE_CONSTANT(variable, value) \
    const uint32_t variable = value;            \
    uint32_t constant_val_##value = value;
#else
#define DEFINE_UNIQUE_CONSTANT(variable, value) \
    const uint32_t variable = value;
#endif
于 2012-08-10T00:08:08.460 回答
0

如果大量常量必须不同并且必须在不同的源文件中定义,那么您可以通过这种方式生成它们,例如,从包含文件名和相应常量名的文件开始,并在每次构建时生成其余的。

输入文件:

[foo.h]
ELEMENT_TYPE_FOO_X
ELEMENT_TYPE_FOO_Y

[boo.h]
ELEMENT_TYPE_BOO_C
ELEMENT_TYPE_BOO_D

剧本:

#!/usr/bin/env python
from ConfigParser import SafeConfigParser
from itertools import count

config = SafeConfigParser(allow_no_value=True)
config.optionxform = lambda x: x # use names as-is
config.read('input.cfg')

counter = count(1)
for filename in config.sections():
    with open(filename, 'w') as f:
         for (name, _), i in zip(config.items(filename), counter):
             f.write("const uint32_t %s = %s;\n" % (name, i))
于 2012-08-10T01:07:46.280 回答