我有一个常量查找表,它由相当稀疏的"魔数" /枚举值键入,因此标准{}位置初始化 最多只会令人难以置信的乏味。
我尝试在单独的源文件中初始化它," 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中的赋值不会导致编译时错误,因为我还没有声明&#34; kSortArray&#34;随处可见。但是当我尝试在&#34; constants.h / constants.cpp&#34;中包含常量关键字时我收到错误。这种方法注定要失败吗?
我尝试了一些其他的建议,比如将它放在一个类中并使用构造函数,但我的尝试抛出了各种模板错误。
任何帮助都非常感激。
答案 0 :(得分:0)
我建议这样做
// 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
。