2009-12-30 62 views
2

去通过gcc版本4.4.2,看来说一种方法来做C++“typedef struct foo foo;”对于C

typedef struct foo foo; 
// more code here - like function declarations taking/returning foo* 
// then, in its own source file: 
typedef struct foo 
{ 
    int bar; 
} foo; 

是合法的C++,但不是在C.

当然,我有一段代码,通过编译用C++罚款使用foo类型,但它似乎我必须使它使用struct foo(在头文件中),以使其与其他开发人员编写的一些C代码一起工作。

有没有办法预先声明中GCC℃的结构的typedef富富没有编译用于C时,会出现“类型定义‘富’的重新定义”错误? (我不想结构的typedef _foo富的轻微违法和不干净的下划线溶液)

+0

重复请参阅http://stackoverflow.com/questions/1492735/differences-between-struct-in-c-and-c/ – joshperry 2009-12-30 15:03:01

回答

3

一个C之间的差异++和C是在C++中是合法的进行重复typedef只要所有这些typedef是相同的范围。在C重复typedef是非法的。

typedef int TInt; 
typedef int TInt; /* OK in C++. Error in C */ 

这就是你在上面的代码。如果你正在尝试编写可被编译为C和C++代码,摆脱多余的第二类型定义的,只是做

typedef struct foo foo; 
... 
struct foo 
{ 
    int bar; 
}; 

(虽然在C++第一typedef是多余的为好)。

+0

成功了,只需在普通头文件或前向声明头文件中写入'typedef struct foo foo'即可。 – moala 2012-02-14 17:21:02

7

这是你需要什么?

// header (.h) 
struct foo; 
typedef struct foo foo; 

foo *foo_create(); 
// etc. 

// source (.c) 
struct foo { 
    // ... 
} 

我也倾向于typdefing作出的私有化明确,并防止可能的名称冲突时,以下划线前缀我的结构名称。

+2

请注意使用下划线时的保留名称,请参阅http://stackoverflow.com/questions/228783 /关于如何使用下划线在交流标识符 – 2009-12-30 14:14:44

+0

良好的联系。我想我会使用修复后的下划线,然后... – 2009-12-30 14:35:25

0

我不确定为什么GCC拒绝这个代码,但它似乎只是对象,因为你定义了两次相同的typedef。

这工作:

typedef struct foo foo; 

struct foo { 
    int bar; 
}; 

而这个作品也有同样的效果:

typedef struct foo { 
    int bar; 
} foo; 
相关问题