【问题标题】:ENUM types and usage in c and c++C 和 C++ 中的 ENUM 类型和用法
【发布时间】:2012-11-07 15:11:19
【问题描述】:

如果我这样写:

typedef enum {
  foo_1,
  foo_2
}foo ;

我发现我可以使用

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

我可以直接使用

int footype = foo_1 在 c 中,

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

【问题讨论】:

  • 只使用foo_1 没有命名空间,它应该在两者中都可以工作,尽管你必须为c++声明using namespace foo
  • @h3nr1x foo 不是命名空间,无需在 C++ 中声明。
  • @icepack 是的,你说得对,我看错了问题,并在typedef 之后省略了foo,对不起

标签: c++ c enums


【解决方案1】:
int footype = foo_1;

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

int footype = foo::foo_1;

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

【讨论】:

    【解决方案2】:

    这个

    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

    【讨论】:

    • 看起来很可疑,好像您没有阅读问题...这是关于编写与 C 和 C++ 兼容的代码(用于头文件)。
    【解决方案3】:

    如果你同意删除 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
    

    【讨论】:

    • 拥有typedef 没有问题
    • 让它gcc -Wall .../g++ -Wall ....
    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多