3

如果我这样写:

typedef enum {
  foo_1,
  foo_2
}foo ;

我发现我可以使用

int footype = foo::foo_1在 C++ 中

我可以直接使用

int footype = foo_1在 c 中,

那么有没有一种方法可以编写在 c++ 和 c 中都可以使用的相同代码?代码在一个只有一种结构的头文件中。

4

3 回答 3

6
int footype = foo_1;

这将在 C 和 C++ 中编译。

int footype = foo::foo_1;

此语法仅对 C++11 的强类型枚举是必需的。

于 2012-11-07T15:16:55.130 回答
4

这个

int footype = foo::foo_1

仅在 C++11 中是合法的。在 C++03 中,枚举不是作用域,这是非法的,就像在 C 中一样。在 C++11 中,有两种类型的枚举——普通的类 C 枚举和作用域枚举,声明为

 enum class

对于后者,枚举员资格(::)是强制性的。对于前者 - 可选。

所以,简单地使用

int footype foo = foo_1;

适用于所有 C、C++03 和 C++11

于 2012-11-07T15:16:10.287 回答
1

如果您可以删除 typedef 它应该“正常工作”

enum {
    foo_1,
    foo_2
};

int
main(void)
{
    int foo = foo_1;

    return 0;
}

用 gcc 和 g++ 为我编译

g++ --std=c++03 enum.cc -o enum_cpp
gcc --std=c99 enum.c -o enum_c
于 2012-11-07T15:18:02.147 回答