枚举的类型声明无效

时间:2014-03-31 07:50:34

标签: c gcc enums wrapper typedef

在库的C包装器(C++)中,我有以下代码:

#ifndef _CWRAPPER_H__
#define _CWRAPPER_H__

// representation of a class inside the library:
typedef struct Foo Foo;  /* This compiles both with gcc and VS */

// representation of an enum inside the library:
typedef enum Bar Bar; /* gcc: "invalid type in declaration", VS compiles fine */

#endif  // _CWRAPPER_H__

为什么这个声明在gcc中是非法的而在VS中不是?我该如何解决?

我正在使用VS 2010并在虚拟机Eclipse CDT中使用gcc 4.8.1。

编辑:显然必须将其编译为C++才能重现此错误。


一种解决方法可能是将其声明为:

typedef unsigned int Bar;

如果一个人提供了所有有效数字Bar,那就可以了。

1 个答案:

答案 0 :(得分:2)

typedef需要有效的类型。在typedef struct Foo Foo的情况下,它可以作为struct Foo的前向声明,它满足typedef的需要。在typedef enum Bar Bar的情况下,这不起作用,因为enum s无法向前声明。

参考。例如。 ISO / IEC 9899:1999§6.7:

  

声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:

     

- 对于一个对象,导致为该对象保留存储;

     

- 对于一个函数,包括函数体; 98)

     

- 对于枚举常量或typedef名称,是(唯一)声明   标识符

C ++有类似的约束:Forward declaring an enum in c++

似乎VS 2010允许将其作为扩展。