在C中声明结构:为什么我必须指定两次名称



为了在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 FooFoo作为类型名和标记(为了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了,对吧?

最新更新