检查大小在编译时是相同的
Check sizes are the same when compiling
我有一个字典和一个数组,它们在程序期间都不会改变大小,但通常可以在预编译时扩展。键的数量和数组长度应该始终是相同的大小。在编译时是否有一种方法可以检查这一点,因为它很容易添加键,但不添加到数组或反之亦然?
有很多方法可以检查编译时间常数。在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 = {};
}
如果它们不匹配,将触发编译时错误
假设字典指的是map
或unordered_map
,那么在编译时没有直接的方法来完成它。你可以在main
中运行assert
,或者你可以强制映射总是从一对数组初始化,然后static_assert
pair数组的长度与你的主数组相同。
相关文章:
- C++:编译时检查匹配的函数调用对?
- 在编译时检查字符串文本的长度
- 编译时检查 #pragma 包的使用情况
- 检查编译时是否存在静态函数
- 编译时检查特征专用化是否具有唯一 ID
- MSVC 无法编译 SFINAE 检查
- 运行时检查失败 #0 用于运行时重新编译
- 如何在 clang 的自动会议中检查支持编译标志
- 检查该类在编译时C++中是否有任何基类
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- 如何检查在编译时是否调用了模板化方法?
- 实现编译检查以避免C++嵌套范围
- 在编译时检查类型是否为 std::basic_string<T> C++
- C++中带有编译时检查的链表
- 尝试编译SFINAE检查中使用的方法体时发生编译错误
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 交叉编译:检查是否可以在64位机器上构建32位