2014-05-04 106 views
4

我想在一个结构里面使用枚举,这个编译和工作正常,与gcc。 但与g++编译时相同的代码会引发错误。枚举结构内 - C vs C++

#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); 
} 

输出海合会

-bash-4.1$ gcc foo.c 
-bash-4.1$ ./a.out 
mode=0 

输出的G ++

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

Hooray!有人明白C和C++是(非常)不同的语言! (当然我在说编译器:P) – Manu343726

+0

确定它们是不同的,有很多不同之处。 – 4pie0

+0

@ Manu343726:如果我将标题修改为'gcc vs g ++'而不是'c vs C++'',您会很开心吗?:) – arunmoezhi

回答

5

MODE1是在foo范围,所以你需要

bar->mode = foo::MODE1; 

需要注意的是,如果你想访问没有范围的枚举类型,您需要声明它们。例如:

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

struct foo 
{ 
    MODE mode; 
    TYPE type; 
}; 
+0

谢谢。说得通。但是我怎么能没有明确告诉编译器'MODE1'属于'foo'。我不能做一个'#define MODE1 foo :: MODE1'。这会违反foo的定义。基本上我想在我的'C'代码中尽量减少'C++'的编码风格:) – arunmoezhi

+1

对于C/C++兼容性,您需要将枚举移到结构之外。 –

+1

@arunmoezhi我不知道我关注。你不想编写C++,但你想编译为C++?这将是非常痛苦的。 – juanchopanza