Являются ли пустые массивы более недоступными gcc?

У меня gcc 4.7.2-3, и я получаю следующую ошибку:

main.c: 5: 6: ошибка: размер массива отсутствует в ‘fname’

main.c: 6: 6: ошибка: размер массива отсутствует в ‘lname’

при инициализации этого:

int fname[]; int lname[]; 

Разве это невозможно, используя более высокие версии gcc? Потому что я уверен, что использовал это раньше …

EDIT: Причина, по которой я говорю, я помню это, потому что я даже вижу это здесь: http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_046.HTM

Вы можете объявить массив без размера, если вы его инициализируете сразу

 int myarr[] = {1, 2, 3}; 

или если он является последним членом структуры

 struct foo { int something; int somethingelse; char emptyarr[]; }; 

Массив нулевой длины может быть либо расширением GNU C, либо элементом гибкого массива, введенным в C99 (какие компиляторы C ++ также поддерживаются, и я не уверен, что он находится в стандарте C ++ или нет). В любом случае они допускаются только как последний элемент структуры и в противном случае не допускаются и не имеют никакого смысла.

Документ, на который вы ссылаетесь, использует или показывает «пустые» массивы. Вы путаете массив, распадающийся на «пустые» массивы.

Я не думаю, что это было возможно в любом компиляторе, размер массива должен быть известен во время компиляции. Вы, вероятно, сразу же выполнили инициализацию:

 int fname[] = { 1, 2, 3}; 

Таким образом, компилятор может получить размер.

EDIT: Ах, пропустил тег “C”. 🙂 Это похоже на незаконность в C ++.

Да, вы можете объявить массив размером 0. Для этого вам необходимо объявить, как указано ниже

 int array[] = {}; 

Например

 int main() { int a[]={}; printf("size = %d", sizeof(a)); return 1; } 

./a.out дает вам 0 в качестве вывода.