2009-04-13 4 views
23

Si j'ai quelque chose comme ce qui suit dans un fichier d'en-tête, comment puis-je déclarer une fonction qui retourne une énumération de type Foo?Renvoyer une énumération à partir d'une fonction dans C?

enum Foo 
{ 
    BAR, 
    BAZ 
}; 

Puis-je faire quelque chose comme ce qui suit?

Foo testFunc() 
{ 
    return Foo.BAR; 
} 

Ou ai-je besoin d'utiliser typedefs ou des pointeurs ou quelque chose?

Répondre

38

En C++, vous pouvez utiliser uniquement Foo.

En C, vous devez utiliser enum Foo jusqu'à ce que vous fournissiez un typedef pour cela. Et puis, lorsque vous faites référence à BAR, vous n'utilisez pas Foo.BAR mais juste BAR. Toutes les constantes d'énumération partagent le même espace de noms.

Par conséquent (C):

enum Foo { BAR, BAZ }; 

enum Foo testFunc(void) 
{ 
    return BAR; 
} 

Ou, avec un typedef:

typedef enum Foo { BAR, BAZ } Foo; 

Foo testFunc(void) 
{ 
    return BAR; 
} 
4

Je crois que les valeurs individuelles dans le enum sont des identificateurs dans leur propre droit, il suffit d'utiliser:

enum Foo testFunc(){ 
    return BAR; 
} 
+0

En C, il faut ENUM Foo; en C++, juste Foo serait OK. –

+0

Merci. Ou le type def que Kenny suggère, je suppose. – dmckee

+0

Oui - ou le typedef fonctionnerait, mais en C++ c'est 'automatique' mais en C il doit être créé manuellement. –

2

Je pense que certains compilateurs peuvent exiger

typedef enum tagFoo 
{ 
    BAR, 
    BAZ, 
} Foo; 
+0

Les compilateurs C accepteraient la fonction avec le typedef en place; Les compilateurs C++ ne l'exigent pas. –

2
enum Foo 
{ 
    BAR, 
    BAZ 
}; 

En C, la Le type de retour devrait avoir enum avant. Et lorsque vous utilisez les valeurs enum individuelles, vous ne les qualifiez en aucune façon.

enum Foo testFunc() 
{ 
    enum Foo temp = BAR; 
    temp = BAZ; 
    return temp; 
} 
Questions connexes