【问题标题】:Enumerations within a struct - C vs C++结构中的枚举 - C 与 C++
【发布时间】:2014-06-21 03:42:54
【问题描述】:

我正在尝试在结构中使用枚举,它可以编译并与gcc 一起正常工作。 但是同样的代码用g++编译时会报错。

#include<stdio.h>
#include<stdlib.h>
struct foo
{
    enum {MODE1, MODE2, MODE3} mode;
    enum {TYPE1, TYPE2} type;
};
void bar(struct foo* bar)
{
    bar->mode = MODE1;
}

int main()
{
    struct foo* foo = (struct foo*) malloc(sizeof(struct foo));
    bar(foo);
    printf("mode=%d\n",foo->mode);
}

使用gcc获得的输出:

 $ gcc foo.c
 $ ./a.out
 mode=0

使用g++获得的输出:

 $ g++ foo.c
 foo.c: In function ‘void bar(foo*)’:
 foo.c:11: error: ‘MODE1’ was not declared in this scope

【问题讨论】:

  • 万岁!了解 C 和 C++ 是(非常)不同的语言的人! (当然我说的是编译器:P)
  • 确定他们是不同的,有很多不同。
  • @Manu343726:如果我把标题改成gcc vs g++而不是c vs c++,你会高兴吗:)
  • 你的标题没问题。发生的事情是,人们常常认为有一种语言叫做 C/C++,有一套规则:)

标签: c++ c gcc struct enums


【解决方案1】:

MODE1foo的范围内,所以需要

bar->mode = foo::MODE1;

请注意,如果您想在没有范围的情况下访问枚举类型,则需要这样声明它们。例如:

typedef enum {MODE1, MODE2, MODE3} MODE;
typedef enum {TYPE1, TYPE2} TYPE;

struct foo
{
    MODE mode;
    TYPE type;
};

【讨论】:

  • 谢谢。说得通。但是如果不明确告诉编译器MODE1 属于foo,我怎么能脱身。我不能做#define MODE1 foo::MODE1。那将违反 foo 定义。基本上我想在我的C 代码中最小化C++ 编码风格:)
  • 为了 C/C++ 兼容性,您需要将枚举移到结构之外。
  • @arunmoezhi 我不确定我是否关注。您不想编写 C++ 代码,但想编译为 C++?那会很痛苦。
  • @PaulR:我不明白。我需要枚举成为该结构的一部分。
  • @juanchopanza:正如我所说,我想最小化C++。我代码中唯一使用C++ 的地方是当我有一些使用不支持C 的Intel TBB 的原子变量时。当然,我完全可以使用foo:MODE1。但我希望有办法避免foo::
猜你喜欢
  • 2016-01-16
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多