web-dev-qa-db-ja.com

Cの関数から列挙型を返しますか?

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

enum Foo
{
   BAR,
   BAZ
};

次のようなことはできますか?

Foo testFunc()
{
    return Foo.BAR;
}

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

26
Paul Wicks

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;
}
45

enumの個々の値はそれ自体が識別子であると信じています。

enum Foo testFunc(){
  return BAR;
}
4
dmckee

一部のコンパイラには

typedef enum tagFoo
{
  BAR,
  BAZ,
} Foo;
2
kenny
enum Foo
{
   BAR,
   BAZ
};

Cでは、戻り値の型の前に列挙型が必要です。また、個々の列挙値を使用する場合、それらを修飾することはありません。

enum Foo testFunc()
{
    enum Foo temp = BAR;
    temp = BAZ;
    return temp;
}
2
Brian R. Bondy