extern const Array Объявление / Ошибка инициализации (недопустимый инициализатор / конфликтующие типы) - PullRequest
0 голосов
/ 03 апреля 2019

Для проекта, над которым я работаю, я хочу статически инициализированный, неизменяемый глобальный массив - в частности, массив , а не и 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 массивы, и что в этом пути недопустимо? Где конфликт типов и почему целочисленный литерал является недопустимым инициализатором для элемента целочисленного массива?

1 Ответ

0 голосов
/ 03 апреля 2019

Каждое из них:

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;

Это отдельные определения переменной массива с именем foo, каждый из которых имеет различный размер.Вы также пытаетесь инициализировать эти массивы одним значением.Вот почему вы получаете ошибки.

Если вы хотите инициализировать массив, вы делаете это следующим образом:

const int foo[5] = { 0, 42, 69, 420, 9001 };

Если вам нужно инициализировать определенные индексы на основе значений перечисления,Вы можете использовать назначенные инициализаторы для этого:

enum {
    E1, E2, E3, E4, E5
};
const int foo[5] = { 
    [E1] = 0, 
    [E2] = 42, 
    [E3] = 69, 
    [E4] = 420, 
    [E5] = 9001 
};
...