3 votes

Redéclaration de l'énumérateur

J'ai obtenu un message d'erreur : redéclaration de l'énumérateur lorsque j'ai compilé mes codes, veuillez voir le code ci-dessous de mon fichier d'en-tête foo.h,

//foo.h

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

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

Ma question est la suivante : pourquoi est-ce que je reçois la redéclaration de l'énumérateur ? Mes énumérations sont dans les différentes structures, donc je peux utiliser ce qui suit,

BG::black
FB::black

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

4voto

Jonathan Leffler Points 299946

Comme indiqué dans les commentaires, si vous utilisez un compilateur C au lieu d'un compilateur C++ pour compiler le code, vous obtiendrez inévitablement les erreurs indiquées. Le code est uniquement valable en C++, vous devez donc utiliser un compilateur C++ pour le compiler.

De plus, 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-colonne comme un symbole valide.


D'après les commentaires ci-dessous :

En fait, le problème se trouve 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++, donc 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 ?

Si vous avez besoin de votre en-tête foo.h pour être bilingue en C et C++, vous ferez probablement mieux avec une seule énumération, sans avoir besoin de l'option FG::black y BG::black de tous les qualificatifs :

#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 au code C de se référer à BG , FG y Colour sans préfixe struct ou enum ; le C++ pur n'aurait pas du tout besoin de ces typedefs. Cependant, vous écrivez du code bilingue et vous devez parfois écrire d'une manière qui semble légèrement guindée dans l'une ou l'autre langue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X