使用循环初始化常量数组?

时间:2016-01-22 12:46:01

标签: c++ arrays

我有一个常量查找表,它由相当稀疏的"魔数" /枚举值键入,因此标准{}位置初始化 最多只会令人难以置信的乏味。

我尝试在单独的源文件中初始化它," 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;中包含常量关键字时我收到错误。这种方法注定要失败吗?

我尝试了一些其他的建议,比如将它放在一个类中并使用构造函数,但我的尝试抛出了各种模板错误。

任何帮助都非常感激。

1 个答案:

答案 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