一种做c ++的方法“typedef struct foo foo;”对于c

时间:2009-12-30 13:56:22

标签: c++ c gcc typedef

按照gcc 4.4.2版进行,似乎在说

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中则不合法。

当然我有一个代码体,可以使用 foo 类型在C ++中编译得很好但看起来我必须使用 struct foo (在头文件中) )让其与一些开发人员编写的C代码一起使用。

在编译C时,有没有办法在gcc C中预先声明 struct typedef foo foo 而不会出现“重新定义typedef'foo'”错误? (我不希望 struct typedef _foo foo 的轻微非法和不太干净的下划线解决方案)

3 个答案:

答案 0 :(得分:7)

这是你需要的吗?

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

foo *foo_create();
// etc.

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

我还倾向于使用下划线为我的结构名称添加前缀,以便明确其私密性并防止可能的名称冲突。

答案 1 :(得分:3)

C ++和C之间的区别之一是,在C ++中,只要所有这些typedef都相同,在同一范围内制作重复typedef是合法的。在C中重复typedef是非法的。

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

这是您在上面的代码中所拥有的。如果您正在尝试编写可以编译为C和C ++的代码,请删除多余的第二个typedef并执行

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

(尽管在C ++中,第一个typedef也是多余的。)

答案 2 :(得分:0)

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

这有效:

typedef struct foo foo;

struct foo {
    int bar;
};

这也有效,效果相同:

typedef struct foo {
    int bar;
} foo;