在库的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
,那就可以了。
答案 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允许将其作为扩展。