Pour le fragment de code C ++ ci-dessous:
class Foo {
int a[]; // warning C4200: nonstandard extension used : zero-sized array in struct/union - Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
};
int a[];
void bar() {
int a[]; // error C2133: 'a' : unknown size
}
4 Réponses :
class Foo {
int a[]; // OK in C, invalid in C++. Does not work with inheritance.
}; // Idea is that structure is "extended" indefinitely by an array.
// May work on your compiler as an extra feature.
int a[]; // error in C and C++: storage size of 'a' isn't known
void bar() {
int a[]; // error in C and C++: storage size of 'a' isn't known
}
extern int a[]; // OK: storage size may be declared later.
int a[5]; // declaration of size before use.
An array type with unspecified size is incomplete. 8.3.4/1:
If the constant expression is omitted, the type of the identifier of D is âderived-declarator-type-list array of unknown bound of Tâ, an incomplete object type.
It must be completed in order to participate in a definition, ie the definition of a must contain a size specification or initialization with an array of specified size.
Je ne comprends pas que le commentaire "doit être terminé avant d'utiliser". Il est parfaitement légal de utiliser i> un tableau de taille non spécifiée en C ++. Vous ne pouvez pas appliquer sizeof code> à celui-ci, mais vous pouvez accéder légalement à ses éléments.
@Andrey: Un argument de fonction déclaré comme une matrice de taille non spécifiée a le type t * code>. C'est une décomposition d'un autre type. Y a-t-il un autre exemple que je devrais être au courant? Votre réponse ne semble pas montrer.
Je ne parlais pas d'arguments de la fonction, qui est une histoire complètement différente. Je me référant à la déclaration extern int a [] code> de votre exemple. Une fois que vous déclarez un tableau comme ça, vous pouvez utiliser i> c'est déjà. Je vois que vous avez supprimé la référence à "Utiliser".
@Andrey: Je voulais dire "utiliser" le type pour définir quelque chose, désolé.
C99 prend en charge quelque chose appelé membre "flexible" qui est autorisé à être le dernier membre d'une structure. Lorsque vous allouez de manière dynamique une telle structure, vous pouvez augmenter la quantité demandée à partir de Certains compilateurs Ajoutent ceci comme une extension à C90 et / ou C ++. < / p> Vous pouvez donc avoir du code comme ce qui suit: p> Vous ne pouvez pas définir une structure avec un élément de matrice flexible directement (en tant que local ou global / Variable statique) Comme le compilateur ne saura pas la quantité de mémoire à allouer pour cela. p> Je ne sais honnêtement pas comment vous utiliserez facilement une telle chose avec C ++ 's malloc () code> pour fournir la mémoire pour la matrice. neuf code > Opérateur - Je pense que vous devrez allouer la mémoire de l'objet à l'aide de MALLOC () code> et utilisez le placement Nouveau code>. Peut-être qu'une surcharge spécifique de classe / structure de nouvel opérateur code> pourrait être utilisée ... p> p>
J'ai pu utiliser un initialiseur désigné pour définir la taille: {.buf [taille-1] = 0}. Ne fonctionne pas avec tous les compilateurs cependant :(
Nous avons utilisé ceci pour désigner un enregistrement de longueur variable de quelque sorte. Quelque chose comme un fichier d'en-tête contenant des informations sur le nombre de structures à suivre, suivi des données elles-mêmes. C'est une matrice de longueur variable et j'ai trouvé qu'il n'est pas bien supporté entre les compilateurs. Certains veulent un tableau []; et certains veulent un tableau [0]; (style ancien). P>
C ++ Langue permet de omettre la taille de la matrice uniquement dans déclarations non définissantes em> Les décartations de classes non statiques sont toujours nécessaires pour spécifier la taille de la matrice p > tandis que membre de la classe statique décartations em> peut omettre la taille p> (la la définition / EM> du même membre devra, bien entendu, spécifier la taille). P> Tous les écarts de ce comportement ne peuvent être expliqués que par un comportement non standard étendu de votre compilateur. Peut-être devriez-vous spécifier certains paramètres de compilateur supplémentaires pour le faire se comporter de manière plus pédante. P> p>
La légende mentionne "des tableaux statiques". Où sont ces "tableaux statiques" dans votre question? Je ne vois pas une seule référence à des "matrices statiques".
Je veux dire des tableaux alloués statiquement. S'il vous plaît n'hésitez pas à modifier la question si vous voyez nécessaire. Merci.