2010-12-11 102 views
2

J'espère que c'est une question simple ... Voici mon processus pour reproduire ce problème. D'abord, je crée mon fichier source:C fichier d'en-tête inclure l'erreur

bash $ cat t.c 
#include "t.h" 

int main() 
{ 
    ABC abc; 
} 

Je crée mon fichier d'en-tête correspondant:

bash $ cat t.h 
#ifdef _T_H 
#define _T_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef struct abc { 
    int a; 
} ABC; 

#ifdef __cplusplus 
} 
#endif 

#endif 

Ensuite, je tente de le compiler:

bash $ gcc -o t t.c 
t.c: In function ‘main’: 
t.c:5: error: ‘ABC’ undeclared (first use in this function) 
t.c:5: error: (Each undeclared identifier is reported only once 
t.c:5: error: for each function it appears in.) 
t.c:5: error: expected ‘;’ before ‘abc’ 

Que se passe-t-il? Si j'utilise 'struct abc' au lieu de 'ABC' comme type dans t.c, alors il compile. Pourquoi les typedefs ne fonctionnent-ils pas?

Répondre

9

Essayez:

#ifndef _T_H 
#define _T_H 

Je est arrivé à remarquer cela parce que le _T_H n'a pas aligné, et mon cerveau subconscient savait qu'il devrait.

+0

Bingo. Wow, ouais, ce petit bout de foiré. Bien, espérons que quelqu'un d'autre qui a ce problème verra ce fil :) – Scott

+0

BTW, ne pas utiliser des choses commençant par un trait de soulignement, ou contenant un double trait de soulignement, pour vos gardes d'en-tête. Ces noms sont réservés à l'utilisation de la bibliothèque standard. Juste 'T_H' fait très bien l'affaire. –