2014-05-04 3 views
4

J'essaie d'utiliser enums à l'intérieur d'une structure et cela compile et fonctionne bien avec gcc. Mais le même code lorsqu'il est compilé avec g++ génère une erreur.enums dans une structure - C vs C++

#include<stdio.h> 
#include<stdlib.h> 
struct foo 
{ 
    enum {MODE1, MODE2, MODE3} mode; 
    enum {TYPE1, TYPE2} type; 
}; 
void bar(struct foo* bar) 
{ 
    bar->mode = MODE1; 
} 

int main() 
{ 
    struct foo* foo = (struct foo*) malloc(sizeof(struct foo)); 
    bar(foo); 
    printf("mode=%d\n",foo->mode); 
} 

sortie pour gcc

-bash-4.1$ gcc foo.c 
-bash-4.1$ ./a.out 
mode=0 

sortie pour g ++

-bash-4.1$ g++ foo.c 
foo.c: In function ‘void bar(foo*)’: 
foo.c:11: error: ‘MODE1’ was not declared in this scope 
+5

Hourra! Quelqu'un qui comprend que C et C++ sont des langues (très) différentes! (Bien sûr, je parle du compilateur: P) – Manu343726

+0

sûr qu'ils sont différents, il y a beaucoup de différences. – 4pie0

+0

@ Manu343726: Seriez-vous heureux si je modifiais le titre en 'gcc vs g ++' au lieu de 'c vs C++' :) – arunmoezhi

Répondre

5

MODE1 est dans le cadre de foo, vous avez donc besoin

bar->mode = foo::MODE1; 

Notez que si vous voulez accéder les types enum sans portée, vous devrez les déclarer ainsi. Par exemple:

typedef enum {MODE1, MODE2, MODE3} MODE; 
typedef enum {TYPE1, TYPE2} TYPE; 

struct foo 
{ 
    MODE mode; 
    TYPE type; 
}; 
+0

merci. Logique. Mais comment puis-je m'en sortir sans dire explicitement au compilateur que 'MODE1' appartient à' foo'. Je ne peux pas faire un '#define MODE1 foo :: MODE1'. Cela violerait la définition de foo. Fondamentalement, je veux minimiser le style de codage 'C++' dans mon code 'C' :) – arunmoezhi

+1

Pour la compatibilité C/C++, vous devez déplacer les énumérations en dehors de la structure. –

+1

@arunmoezhi Je ne suis pas sûr de suivre. Vous ne voulez pas coder C++, mais vous voulez compiler en C++? Cela va être très douloureux. – juanchopanza