Для проекта, над которым я работаю, я хочу статически инициализированный, неизменяемый глобальный массив - в частности, массив , а не и enum
. Насколько мне известно, лучший способ сделать это с массивом extern const
. Однако, когда я пытаюсь инициализировать и объявить любой массив foo
, я получаю две разные, но явно связанные ошибки компилятора:
error: conflicting types for `foo'
error: invalid initializer
Они повторяются для каждой инициализации во внешней области моего .c
файла. За первой из этих ошибок всегда следует примечание, читающее «previous declaration of `foo' was here
» и указывающее на объявление массива в заголовочном файле.
В следующем примере ...
#ifndef __MWE__
#define __MWE__
extern const int foo[8];
#endif /* MWE */
#include "mwe.h"
const int foo[0] = 0;
const int foo[1] = 42;
const int foo[2] = 69;
const int foo[3] = 420;
const int foo[4] = 9001;
int main(int argc,char**argv){return 0;}
... Я получаю следующие ошибки ...
mwe.c:3:11: error: conflicting types for ‘foo’
const int foo[0] = 0;
^~~
In file included from mwe.c:1:0:
mwe.h:4:18: note: previous declaration of ‘foo’ was here
extern const int foo[5];
^~~
mwe.c:3:20: error: invalid initializer
const int foo[0] = 0;
^
mwe.c:4:11: error: conflicting types for ‘foo’
const int foo[1] = 42;
^~~
In file included from mwe.c:1:0:
mwe.h:4:18: note: previous declaration of ‘foo’ was here
extern const int foo[5];
^~~
mwe.c:4:20: error: invalid initializer
const int foo[1] = 42;
^~
mwe.c:5:11: error: conflicting types for ‘foo’
const int foo[2] = 69;
^~~
In file included from mwe.c:1:0:
mwe.h:4:18: note: previous declaration of ‘foo’ was here
extern const int foo[5];
^~~
mwe.c:5:20: error: invalid initializer
const int foo[2] = 69;
^~
mwe.c:6:11: error: conflicting types for ‘foo’
const int foo[3] = 420;
^~~
In file included from mwe.c:1:0:
mwe.h:4:18: note: previous declaration of ‘foo’ was here
extern const int foo[5];
^~~
mwe.c:6:20: error: invalid initializer
const int foo[3] = 420;
^~~
mwe.c:7:11: error: conflicting types for ‘foo’
const int foo[4] = 9001;
^~~
In file included from mwe.c:1:0:
mwe.h:4:18: note: previous declaration of ‘foo’ was here
extern const int foo[5];
^~~
mwe.c:7:20: error: invalid initializer
const int foo[4] = 9001;
Как правильно объявлять и инициализировать extern const
массивы, и что в этом пути недопустимо? Где конфликт типов и почему целочисленный литерал является недопустимым инициализатором для элемента целочисленного массива?