3

私の質問は次のとおりです。識別子として機能する多数の static 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 };
};

しかし、それは複雑な解決策のようです。よりエレガントで優れたソリューションがあるかどうかはわかりません。これまでのところ何も見つかりませんでした。

前もって感謝します。

4

3 に答える 3

6

マクロを使用してこれを行うことができます:

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

同じ値を 2 回使用すると、複数定義エラーが発生します。

(技術的には、これはコンパイル時ではなくリンク時にエラーを検出します。)

于 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 に答える