2010-09-24 11 views
4

J'ai confondu par le fait que ce code fonctionne:C de la norme - comment "tableau d'inconnu lié de T" est traité

struct S 
{ 
    char c[]; 
}; 
S s; 

Selon C++ standard, chapitre 8.3.4:

« Si l'expression constante est omise, le type de l'identifiant de D est « groupement dérivé du declarator de type liste de inconnue lié de T », un type d'objet incomplet . »

Mais je n'arrive pas à comprendre comment le "type d'objet incomplet" devient complet.

Merci pour votre aide!

+1

Bienvenue à SO, tout en posant la question vous pouvez utiliser les boutons en haut (1010, etc) pour mettre en forme le code et citez correctement votre question. – Naveen

+1

Merci, j'ai raté ce – nyrl

+1

voir aussi http://stackoverflow.com/questions/2717671/static-arrays-defined-with-unspecified-size-empty-brackets – rwong

Répondre

3

Vous avez dit que le code que vous avez posté sera compilé dans VS10. Désactivez les extensions de langue, mais ce n'est pas le cas. Projet> Propriétés> C/C++> Langue> Désactiver les extensions de langue = Oui. C'est compiler parce que vous utilisez une extension MS spécifique au langage C++.

En bref, selon la norme, votre code ne devrait pas compiler.

+2

"Lorsqu'un tableau est utilisé comme type d'un membre non statique, toutes les dimensions doivent être spécifiées." (9.2/8) –

+0

En effet, VS2010 avec/Za ne compile pas le code. – nyrl

0

Il semble que cette fonctionnalité de langage a été inventée afin de permettre l'initialisation du tableau plus tard dans le fichier source. Si je rends c non statique, au moins sur Visual Studio 2010, il ne parvient pas à compiler, indiquant que la longueur de c a été fixée à 0 et que la redeclaration des membres n'est pas autorisée.

// header file 
struct S 
{ 
    static char c[]; 
    static size_t len; 
}; 
extern S s; 

// source file 
char S::c[] = "haha"; 
size_t S::len = (sizeof(S::c)/sizeof(S::c[0])) - 1;