在C语言中从函数返回一个枚举类型?

35
如果我在头文件中有以下内容,如何声明一个返回类型为Foo枚举的函数?
enum Foo
{
   BAR,
   BAZ
};

我可以像下面这样做吗?

Foo testFunc()
{
    return Foo.BAR;
}

还是需要使用typedef或指针之类的东西吗?

4个回答

67
在C ++中,你可以只使用Foo
在C语言中,必须使用enum Foo,直到你为其提供一个typedef。
然后,当你引用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;
}

另一个人们不喜欢C++的原因。 - Eric

5

我认为enum中的各个值本身就是标识符,只需使用:

enum Foo testFunc(){
  return BAR;
}

在C语言中,需要使用enum Foo; 而在C++中,只需要使用Foo即可。 - Jonathan Leffler
谢谢。或者像Kenny建议的那样使用typedef。 - dmckee --- ex-moderator kitten
是的 - 或者typedef会起作用,但在C++中这是“自动”的,而在C中必须手动创建。 - Jonathan Leffler

2

我认为有些编译器可能需要

typedef enum tagFoo
{
  BAR,
  BAZ,
} Foo;

1
C编译器将接受带有typedef的函数;而C++编译器不需要它。 - Jonathan Leffler

2
enum Foo
{
   BAR,
   BAZ
};

在C语言中,返回类型应该在之前加上枚举(enum)关键字。当你使用单个枚举值时,不需要以任何方式进行限定。
enum Foo testFunc()
{
    enum Foo temp = BAR;
    temp = BAZ;
    return temp;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接