C - déclaration anticipée d'énumérations?
Avant la déclaration d'énumérations en C ne fonctionne pas pour moi. J'ai cherché sur internet et stackoverflow mais toutes les questions concernant la déclaration des agents recenseurs se référer à c++. Que faites-vous pour déclarer les agents recenseurs en C? Les mettre en haut de chaque fichier (ou dans un include), de sorte que toutes les fonctions dans le fichier peuvent y accéder? Grâce
Généralement ses dans un include, pouvez-vous nous montrer le code pour voir quel est le problème que vous rencontrez est?
OriginalL'auteur loop | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
Les mettre dans un en-tête de sorte que tous les fichiers qui en ont besoin peuvent accéder à l'en-tête et d'utiliser les déclarations.
Lorsqu'il est compilé avec les options:
GCC 4.2.1 (sur mac os X 10.7.1) accepte le code suivant:
Ajouter
-pedantic
et il avertit:Ainsi, vous ne devez pas essayer de l'utiliser avant les déclarations de types énumérés dans C; GCC permet comme une extension lorsqu'il n'est pas forcé d'être pédant.
OriginalL'auteur Jonathan Leffler
Vous ne pouvez pas "l'avant-déclarer" les énumérations, parce que le compilateur ne sais pas la taille de l'enum. Le C standard dit " Chaque type énuméré doit être compatible avec le char, un entier signé un type ou d'un type entier non signé. Le choix du type de mise en œuvre est définie, mais doit être capable de représenter les valeurs de tous les membres de l'énumération".
Vous pourriez, à peu près, au cas qu'un pointeur vers une incomplètes enum (comme dans mon exemple de code) fait une sorte de sens. Mais il est assez ténue -- votre conclusion qu'ils sont essentiellement aucune utilisation pratique quand incomplète est correct.
vous pouvez utiliser une définition incomplète d'un struct dans les fichiers d'en-tête, de même, vous pourriez avoir une définition incomplète d'un enum soutenue par une définition ailleurs, et d'avoir eu cette définition inclut à chaque point de l'utilisation de valeurs enum.
Mon cas d'utilisation a été (dans un en-tête):
enum Foo { ... }; enum Bar; enum Foo bar2foo( Bar bar );
nous avons Donc déclarer une fonction qui retourne un Foo. Si vous voulez l'utiliser, vous aurez également besoin d'inclure la définition de Foo.Ce n'est pas un argument.
typedef struct S S;
fonctionne, maistypedef enum E E;
n'est pas, malgré les deux ayant pas défini de tailles. En fait, avant les déclarations sont tout à propos de pas la connaissance de la taille des entités concernées.OriginalL'auteur Foo Bah