C89:声明大型常量数组,然后使用它,然后初始化它

C89: declare large const array, then use it, then initialize it

这纯粹是为了便于阅读。我想要一个非常大的常量值数组,但这使我的文件阅读起来不那么愉快。所以我想在使用后初始化该数组,尽管我希望它保持不变。我知道这可能是不可能的,但它可能也很常见。那么有什么解决方法呢?我现在不想创建单独的文件。

类似的东西:

static const float array_of_values[1000];

float getValueFromArray(int index)
{
    return array_of_values[index];
}

array_of_values = {0.123f, 0.456f, 0.789f ...};

首先,您所做的不是初始化,而是简单的赋值。而且您不能分配给数组。而且你不能在函数之外有一般性的陈述。如果要初始化数组,需要在定义数组的时候进行。

话虽如此,您必须记住(或了解)任何没有显式初始化的定义都是 tentative

这意味着您可以创建一个暂定定义,基本上是为了让声明不受影响。然后在源文件后面的地方你可以添加 actual 定义:

static const float array_of_values[1000];

float getValueFromArray(int index)
{
    return array_of_values[index];
}

static const float array_of_values[] = { 0.123f, 0.456f, 0.789f, /* ... */ };

这些是使文件不那么难读的常用解决方案:

static const float array_of_values[1000] = { MACRO }; // macro being an initalizer list

static const float array_of_values[1000] = 
{ 
  #include "initlist.h"
};

我个人会推荐宏版本,因为它更灵活且不那么神秘。您仍然可以在单独的头文件中声明宏。

还有暂定定义,这通常不是一个好主意,同样是因为它使代码神秘且难以阅读:

static const float array_of_values[1000];

float getValueFromArray(int index)
{
    return array_of_values[index];
}

static const float array_of_values[1000] = {0.123f, 0.456f, 0.789f};

#include <stdio.h>

int main (void)
{
  printf("%f\n", array_of_values[0]);
  printf("%f\n", getValueFromArray(0));
}

试试这个:

#include <stdio.h>

static float array_of_values_base[1000]; // the effective array has "base" in its identifier
static const float *array_of_values = array_of_values_base; // your array is now a pointer

float getValueFromArray(int index)
{
    return array_of_values[index];
}

int main(void) {
    array_of_values_base[0] = 0.123f;
    array_of_values_base[1] = 0.456f;
    array_of_values_base[2] = 0.789f;
    // ...
    printf("value at index 1 is %f\n", getValueFromArray(1));
}