2011-02-15 3 views
7

J'ai un fichier catalog.h avec ceerreur: déclaration prévue spécificateurs ou '...' avant 'list_node'

typedef struct node* list_node; 
struct node 
{ 
    operationdesc op_ptr; 
    list_node next; 
}; 

et un parser.h avec ce

#include "catalog.h" 

int parse_query(char *input, list_node operation_list); 

deux têtes ont #ifndef, #define, #endif. Le compilateur me donne cette erreur: expected declaration specifiers or ‘...’ before ‘list_node’ sur la ligne parse_query. Quel est le problème? J'ai essayé de mettre le typedef dans parser.h, et ça va. Pourquoi ai-je cette erreur quand le typedef est dans catalog.h?

+0

En fait, j'avais un #include "parser.h" dans le catalogue.h. Je l'ai enlevé, et maintenant il compile normalement ... Je suppose qu'il a essayé de charger la définition de parse_query avant la définition de typedef et de struct ..? – pvinis

+0

Qu'est-ce que le #ifndef dans catalog.h ressemble exactement? Essayez cc -E pour voir la sortie du préprocesseur pour voir si list_node est réellement défini au point de la ligne parse_query. –

+0

Vous semblez avoir deux fichiers qui se «# comprennent» l'un l'autre. Cela ne peut pas fonctionner à cause des gardes inclus. Regardez le fichier après le prétraitement et voyez. Même si vous contournez le problème, les dépendances circulaires sont généralement mauvaises et doivent être éliminées. Essayez de réorganiser vos déclarations afin qu'il n'y ait pas de '# include' récursif. –

Répondre

0

Essayez ceci pour catalog.h:

typedef struct node_struct { 
    operationdesc op_ptr; 
    struct node_struct* next; 
} node; 

typedef node* list_node; 
+8

Les noms commençant par deux caractères de soulignement sont réservés, ne les utilisez pas. –

6

L'erreur est-ce (de votre commentaire):

I had an #include "parser.h" in the catalog.h. I removed it, and now it compiles normally...

En supposant que #include "parser.h" était avant la typedef dans catalog.h, et vous avez un fichier source inclut catalog.h avant parser.h, puis au moment où le compilateur inclut parser.h, le typedef n'est pas encore disponible. Il est probablement préférable de réorganiser le contenu des fichiers d'en-tête afin de ne pas avoir de dépendance circulaire.

Si ce n'est pas une option, vous pouvez vous assurer que tous les fichiers sources qui incluent ces deux fichiers incluent parser.h en premier (ou seulement).

Questions connexes