2017-02-08 4 views
0

I ont le morceau de code suivant:type de matrice est de type élément incomplet lorsque définir de nouveaux types de données

#include <stdio.h> 

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

Le compilateur (GCC-4.9.2) montre erreur: type de réseau est de type élément incomplet.
J'ai quelques questions: 1.
est la définition de new_type par typedef acceptée par la norme C90? Dans ce cas, new_type est un type de données qui définit un tableau d'un nombre indéfini d'éléments ou un pointeur à un tableau de int?
2.Dans nous gardons la ligne typedef int new_type[];, comment peut-on définir une variable de type new_type? Nous vous remercions de votre aide.

+0

Quelle devrait être 'number'? Il a 8 éléments, mais les éléments sont des tableaux de taille indéterminée. Cela ne peut pas être alloué. – ikegami

+2

Note: 'typedef' à portée locale n'est pas très utile Et dans quel but un tableau -typedef de taille indéterminée serait bon pour est très discutable. – Olaf

+0

Pourquoi ne pas utiliser 'typedef int my_int; my_int a [8]; '? (avoir le 'typedef' à la portée du fichier). – Olaf

Répondre

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?

Le typedef lui-même est pas un problème, puisque vous pouvez typedef types incomplets (typedef struct A A_s;). Et new_type est en effet à peu près ce que vous pensez qu'il est.

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

Pour une définition variable, le type de la variable doit être un type complet, donc:

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

RÉSULTERA en Number étant un tableau de int de taille 3. Cependant, vous essayez de define Number en tant que tableau de int[] de taille 8().

Mais un tableau de taille non spécifiée ne peut pas être utilisé pour définir une variable, un tableau ou être un membre d'une structure (pas d'un type incomplet peut être utilisé à cette fin).


1. À moins qu'il est le dernier, un membre du groupe souple est autorisé (avec beaucoup de restrictions à ce sujet).

+0

Merci monsieur, pour votre réponse claire et détaillée. – TonyJ

+0

mais si je le change en 'new_type Number = {0};' il se construit avec succès mais comment le compilateur connait-il la taille réelle de 'Number'? – TonyJ

+0

@TonyJ - Parce que vous avez fourni un initialiseur de tableau ('{0}'). Il a 1 élément («0»), donc la taille peut être déduite pour être 1. – StoryTeller