2009-04-13 11 views
23

ヘッダーファイルに次のようなものがある場合、Foo型の列挙型を返す関数をどのように宣言しますか?Cの関数から列挙型を返しますか?

enum Foo 
{ 
    BAR, 
    BAZ 
}; 

次のようにすればいいですか?

Foo testFunc() 
{ 
    return Foo.BAR; 
} 

また、typedefやポインタなどを使用する必要がありますか?

答えて

38

C++では、Fooだけ使用できます。

Cでは、typedefを指定するまで、enum Fooを使用する必要があります。

そして、BARを参照するときは、Foo.BARではなく、BARを使用します。すべての列挙定数は同じ名前空間を共有します。

従って(C用):

enum Foo { BAR, BAZ }; 

enum Foo testFunc(void) 
{ 
    return BAR; 
} 

あるいは、typedefを有する:

typedef enum Foo { BAR, BAZ } Foo; 

Foo testFunc(void) 
{ 
    return BAR; 
} 
4

私はちょうど使用し、enum内の個々の値は、それ自体での識別子であることを信じている:

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

Cにおいて、それが列挙はFooを必要とします。 C++では、Fooだけでも問題ありません。 –

+0

ありがとうございます。ケニーが示唆しているタイプの違いだと思います。 – dmckee

+0

はい - またはtypedefは動作しますが、C++では 'automatic'ですが、Cでは手動で作成する必要があります。 –

2

私は、いくつかのコンパイラはCで

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

Cコンパイラはtypedefを指定してその関数を受け入れます。 C++コンパイラはそれを必要としません。 –

2
enum Foo 
{ 
    BAR, 
    BAZ 
}; 

を必要とするかもしれないと思います戻り値の型はその前にenumを持つべきです。また、個々の列挙値を使用する場合、それらを修飾することはありません。

enum Foo testFunc() 
{ 
    enum Foo temp = BAR; 
    temp = BAZ; 
    return temp; 
} 
関連する問題