2010-11-05 32 views
0

J'écris actuellement un logiciel de reconnaissance de jetons pour XML. Je vais sur la base de FSA de le faire. J'ai donc un fichier d'en-tête qui a le code suivant ...C++ - Trop de fichiers inclus? & Struct Redéfinition?

#define MAX_LENGTH 512 
#define MAX_NAME 25 

struct token 
{ 
    char name[MAX_NAME + 1]; 
    int type; 
    unsigned char str[MAX_LENGTH + 1]; 
}; 

#define TOKEN_TYPES 8 

#define SPACES 0 
#define NEWLINE 1 
#define WORD 2 
#define BEGINTAG 3 
#define ENDTAG 4 
#define EMPTYTAG 5 
#define ERROR 6 
#define ENDFILE 7 

Avec cela, je reçois l'erreur:

error C2011: 'token' : 'struct' type redefinition 

Je reçois également une autre erreur étrange dans mon dossier gettoken.cpp. Où je mets en œuvre la FSA. Le fichier est trop long pour afficher tout le contenu. Mais avec cela, je reçois l'erreur ...

error C1014: too many include files : depth = 1024 

Et voici une partie du code pour ce fichier .cpp. J'inclurai seulement mes importations dans ceci. Je suis sûr que c'est quelque chose de stupide comme c'est habituellement pour moi. Mais s'il vous plaît aidez-moi! Merci!

+0

Avez-vous ajouté des gardes à inclure vos têtes? – George

+1

Une raison pour laquelle vous n'utilisez pas simplement 'std :: string'? Et un 'enum'? Ou des constantes au lieu de '# define' au * moins *. – GManNickG

Répondre

3

Je suppose que vous incluez votre fichier d'en-tête deux fois. Avez-vous un garde contre cela? Chaque fichier d'en-tête doit avoir ceci:

#ifndef TOKEN_H 
#define TOKEN_H 

[your header file code] 

#endif 

Si ce n'est pas le cas, assurez-vous que vous ne définissez pas le jeton deux fois ailleurs.

+0

wow, je suis un idiot. J'avais mes gardes d'inclusion mais quand j'ai copié et collé dans Visual Studio, je les ai laissés par hasard! Merci! – Johnrad

1

Il vous manque probablement le include guards et d'entrer dans la récursion de fichier include.

1

Ajouter cette ligne à chaque fichier d'en-tête:

#pragma once 
+0

Pourquoi ajouter une ligne non standard à chaque fichier d'en-tête? – GManNickG

+0

Pourquoi ajouter des chaînes aléatoires répétées dans 3 lignes à chaque fichier d'en-tête? Vous l'appelez non-standard, mais chaque compilateur le supporte bien. – Blindy

+1

Ce n'est toujours pas standard. (Ce n'est pas important pour beaucoup de gens) – EboMike