2017-02-08 4 views
0

У меня есть следующий фрагмент кода:типа массив имеет неполный тип элемента, когда определить тип данных нового

#include <stdio.h> 

int main(void) { 
    typedef int new_type[]; 
    new_type Number[8]; 
    return 0; 
} 

Компилятор (Gcc- 4.9.2) показывает ошибку: типа массив имеет незавершенный элемент типа.
У меня есть некоторые вопросы:
1. Является ли определение new_type через typedef принятым стандартом C90? В этом случае new_type является типом данных, который определяет массив неопределенного числа элементов или указатель для массива int?
2.Если мы сохраняем строку typedef int new_type[];, как мы можем определить переменную типа new_type? Благодарим вас за помощь.

+0

Насколько велик «номер»? Он имеет 8 элементов, но элементы представляют собой массивы неопределенного размера. Это невозможно выделить. – ikegami

+2

Примечание: 'typedef' в локальной области не очень полезен. И какая цель массив-'typedef' неопределенного размера был бы хорош для очень сомнительной. – Olaf

+0

Почему бы не использовать 'typedef int my_int; my_int a [8]; '? (имеют 'typedef' в области файлов). – Olaf

ответ

2

Is the definition of new_type through typedef accepted by C90 standard? In this case, new_type is a data type that defines an array of undefined number of element or a pointer to an array of int?

Сам ЬурейеЕ не является проблемой, так как вы можете неполные типы определение типа во (typedef struct A A_s;). И new_type действительно в значительной степени то, что вы думаете.

If we keep the line typedef int new_type[]; , how can we define a variable of type new_type?

Для определения переменной, тип переменной должен быть полный тип, так:

typedef int new_type[]; 
new_type Number = { 1, 2, 3 }; 

будет приводить к Number быть массивом int размера 3. Тем не менее, вы пытаетесь define Number в качестве массива int[] размера 8 (int Number[8][];).

Но массив неопределенного размера не может использоваться для определения любой переменной, массива или быть членом структуры (для этих целей не может быть использован неполный тип).


1. Если это не последний членгибкого массива допускаются (с большим количеством ограничений на него).

+0

Спасибо, сэр, за ваш четкий и подробный ответ. – TonyJ

+0

, но если я изменю его на 'new_type Number = {0};' он будет успешным, но как компилятор знает фактический размер 'Number'? – TonyJ

+0

@TonyJ - Потому что вы предоставили инициализатор массива ('{0}'). Он имеет 1 элемент ('0'), поэтому размер можно вывести равным 1. – StoryTeller

Смежные вопросы