为了在C中声明一个结构,我一直在使用
typedef struct Foo Foo;
然后在下面的某个点定义它。
为什么我必须指定两次结构的名称(Foo
(?
格式为
typedef old_type new_type
也是如此
typedef struct Foo Foo;
struct Foo
是旧类型,Foo
是新类型,所以无论何时键入Foo
,它实际上都是struct Foo
的别名。
struct Foo
是为创建新类型别名的类型。最后一个Foo
是新类型的名称。如果您的结构声明是可见的,那么您可以像这样编写类型定义和结构声明组合,以避免重复的Foo
:
typedef struct {
...
} Foo;
您不必指定两个名称。您可以引入一个不完整的结构类型,如下所示:
struct Foo;
就是这样。或者一个完整的:
struct Foo { int x; };
这两个声明都没有在作用域中引入名称;它们引入了一个struct标记。
如果引入struct标记,则必须在所有地方使用struct
关键字来引用它,例如
struct Foo f;
void fun(struct Foo *param);
使用CCD_ 10是为了不必到处写入CCD_。类型名称不必与标签相同:
typedef struct Foo_s Foo;
Foo f;
void fun(Foo *param);
C的C++方言改变了规则;在C++中,struct Foo
将Foo
作为类型名和标记(为了C兼容性(引入作用域。
您可能看到typedef struct Foo Foo
的一个原因可能是代码以C++开头,看起来像这样:
struct Foo; // Originally C++ only header file.
void fun(Foo *param);
然后出现了一个要求,即必须支持C,至少在头文件中是这样。在C中,未声明Foo
类型:
typedef struct Foo Foo; // Fix for C.
#ifdef __cplusplus
#define extern_c extern "C" // C compatible linkage for fun
#endif
void fun(Foo *param);
#ifdef __cplusplus
}
#endif
尽管C++在这方面看起来更方便,但它的对象系统绝对会用重复相同标识符来惩罚用户,就像你不会相信的那样。
要定义一个带有构造函数和析构函数的基类骨架,而这些构造函数和析构函数没有内联在类声明中,我们必须将名称重复七次:
class foo {
public:
foo();
~foo();
};
foo::foo()
{
}
foo::~foo()
{
}
好在C++程序员至少不用到处写class foo *fooptr
了,对吧?