我有一个常量查找表,它是由相当稀疏的“魔术数字”/枚举值键构成的,因此标准的{}位置初始化最多只能是令人难以置信的乏味。
我尝试在一个单独的源文件"constants.cpp“中初始化它
#define SORT_ARRAY_SIZE 1024
size_t kSortArray[SORT_ARRAY_SIZE];
void InitializeSortArray()
{
// Only a subset of the reserved SORT_ARRAY_SIZE positions are used.
// Which ones are compile-time "magic numbers".
for (int i = 0; i < SORT_ARRAY_SIZE; ++i)
{
switch (i)
{
case 57: // Magic number #1.
kSortArray[i] = 0;
break;
case 213: // Magic number #2.
kSortArray[i] = 1;
break;
}
}
}然后在头文件constants.h中将其设置为外部
#ifndef CONSTANTS_H
#define CONSTANTS_H
#define SORT_ARRAY_SIZE 1024
extern size_t kSortArray[SORT_ARRAY_SIZE];
#endif然后在主文件binner.c中使用它。
int main(int argc, char* argv[])
{
kSortArray[0] = 3; // Compile-time error desirable.
return 0;
}所有这些都很好地编译和工作,只是main中的赋值不会导致编译时错误,因为我还没有将"kSortArray“声明为常量。但是,当我尝试在"constants.h / constants.cpp“中包含一个常量关键字时,就会出现错误。这种方法注定要失败吗?
我尝试了其他一些建议,比如将其放入类中和使用构造函数,但我的尝试抛出了各种模板错误。
任何帮助都很感激。
发布于 2016-01-22 13:03:46
我建议这样做
// in the header
// include whatever header you're using to declare size_t
const size_t SORT_ARRAY_SIZE = 1028;
extern const size_t *kSortArray;
// in your constants compilation unit
namespace
{
static size_t the_array[SORT_ARRAY_SIZE];
}
const size_t *kSortArray = ::the_array;然后更改您的InitializeSortArray(),使其初始化::the_array。
https://stackoverflow.com/questions/34947087
复制相似问题