按照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 的轻微非法和不太干净的下划线解决方案)
答案 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;