编译时检查大小是否相同

时间:2011-11-16 17:02:52

标签: c++ compilation c-preprocessor

我有一个字典和一个数组,它们在程序期间既不会改变大小,但通常可以在编译前进行扩展。键的数量和数组长度应始终相同。有没有办法在编译时检查这个,因为它很容易添加密钥而不是数组,反之亦然?

2 个答案:

答案 0 :(得分:3)

有一些方法可以检查编译时常量。在C ++ 11中,它已被static_assert巩固,但也可以使用模板。

例如:

enum Key {
  K_Zero,
  K_One,
  K_Two,
  K_NUMBER_ELEMENTS
};

static char const Dictionary[] = { ... };

你会这样做C ++ 11:

static_assert(K_NUMBER_ELEMENTS == ARRAY_SIZE(Dictionary),
              "Keys / Dictionary mismatch");

ARRAY_SIZE定义为:

template <typename T, unsigned N>
char (&ComputeArraySize(T (&)[N]))[N];

#define ARRAY_SIZE(Array) sizeof(ComputeArraySize(Array))

如果您还在使用C ++ 03(如果您不知道该版本可能就是这种情况),那么您应该更加聪明并将static_assert替换为:

template <unsigned M, unsigned N> struct mp_equal;

template <unsigned N> struct mp_equal<N,N> {};

namespace {
  mp_equal<K_NUMBER_ELEMENTS, ARRAY_SIZE(Dictionary)> 
    AssertKeysAndDictionarySizeMatch = {};
}

如果它们不匹配,将触发编译时错误。

答案 1 :(得分:2)

假设你的字典意思是mapunordered_map,那么在编译时没有直接的方法。您可以在assert中运行main或者您可以强制地图始终从对数组中初始化,然后static_assert表示对数组的长度与主数据相同阵列。