2010-10-12 2 views
2

je me suis une erreur: redéclaration du message recenseur quand je compile mes codes, s'il vous plaît voir de bien vouloir le code ci-dessous de mon fichier d'en-tête de foo.h,Redéclaration de recenseur

//foo.h 

struct FG 
{ 
    enum 
    { 
     black = 1, 
     red = 2, 
     green = 3 
    }; 
}; 

struct BG 
{ 
    enum 
    { 
     black = 1, 
     red = 2, 
     green = 3 
    }; 
}; 

Ma question est, pourquoi je reçois la redéclaration de l'énumérateur? mes enums sont dans les différentes structs, donc je peux utiliser ce qui suit,

BG::black 
FB::black 

S'il vous plaît aviser.

EDIT: voici l'erreur exacte

/home/sasayins/foobar/foo.h:10: error: redeclaration of enumerator ‘black’ 
/home/sasayins/foobar/foo.h:3: note: previous definition of ‘black’ was here 
+1

Êtes-vous sûr de ne pas inclure le fichier d'en-tête deux fois? –

+0

Il n'y a rien de mal avec ce code. Quelle est exactement l'erreur du compilateur? Votre fichier d'en-tête est-il inclus plus d'une fois? A-t-il des gardes d'inclusion appropriés? –

+0

oui, et j'ai la garde d'inclusion. – domlao

Répondre

3

Comme il est indiqué dans les commentaires, si vous utilisez un compilateur C au lieu d'un compilateur C++ pour compiler le code, alors vous allez inévitablement obtenir les erreurs affichées. Le code est uniquement valide en C++, vous devez donc utiliser un compilateur C++ pour le compiler. En outre, si vous utilisez un compilateur C, vous ne pourrez pas utiliser les noms qualifiés comme 'FG::black' ou 'BG::black' pour désambiguïser les noms; C ne reconnaît pas le double-point comme symbole valide.


D'après les commentaires ci-dessous:

Actually the problem is in another file; my C file includes the header file, which is the header contains a C++ code file, so that is the cause of the problem. So my header file (foo.h) contains a valid code. Could you suggest a structure for C header file?

Si vous avez besoin de votre tête foo.h être bilingue en C et C++, vous ferez probablement mieux avec une seule énumération, perdant la nécessité de « FG :: noir » qualificatifs et « de BG :: noir » au total:

#ifndef FOO_H_INCLUDED 
#define FOO_H_INCLUDED 

typedef enum Colour 
{ 
    black = 1, 
    red = 2, 
    green = 3 
} Colour; 

typedef struct FG 
{ 
    ... 
    Colour shade; 
    ... 
} FG; 

typedef struct BG 
{ 
    ... 
    Colour shade; 
    ... 
} BG; 

#endif // FOO_H_INCLUDED 

Notez que les typedefs sont nécessaires pour permettre à un code C pour désigner « BG », « FG » et « Couleur » sans préfixe «struct» ou «enum»; le C++ pur n'aurait pas besoin de ces typedefs. Cependant, vous écrivez du code bilingue et parfois vous devez écrire d'une manière qui semble légèrement guindée dans l'une ou l'autre langue.

+0

merci, il semble que j'ai un problème avec mon makefile. – domlao

+1

@sasayins: alors peut-être devriez-vous montrer le makefile? Ou la commande de compilation? Quelle est l'extension de votre fichier source C++? Utiliser .cpp ou .cxx ou .C est conventionnel, mais ce dernier (.C) pourrait être confondu avec .c sur un système de fichiers insensible à la casse. –

+0

Merci beaucoup. En fait le problème est dans un autre fichier, mon fichier C inclut le fichier d'en-tête, qui est l'en-tête contient un fichier de code C++, de sorte que c'est la cause du problème. Donc mon fichier d'en-tête (foo.h) contient un code valide. Pourriez-vous suggérer une structure pour le fichier d'en-tête C? merci – domlao

Questions connexes