我遇到了来自遗留代码库的一些C代码,这让我抓狂了。
该代码到处都是具有typedef的结构,如下所示。
typedef struct Foo {
char *data;
int stuff;
} *Foo;
Run Code Online (Sandbox Code Playgroud)
使用GCC可以编译良好。
我的问题是将结构类型化为结构指针的目的是什么?这是几年前的标准做法吗?有什么我想念的吗?似乎很糟糕,因为它混淆了struct指针。在理解此遗留代码方面的任何帮助将不胜感激。
这不是您的问题的直接内容。是专门关于名称相同的吗?或者是关于在 typedef 名称后面隐藏指针类型?
第一部分实际上不是问题,因为struct FooC 语言中的声明没有引入 name Foo。Foo是所谓的struct tag,它本身不能使用。struct Foo声明引入的完整类型名称是struct Foo,即struct和Foo都需要形成类型的完整名称。将此类型定义struct Foo为一个较短的 typename Foo,它可以单独使用,是一种广泛且相当有用的做法。没有什么不寻常的地方,并且 typename 的拼写与 struct tag 的拼写一致这一事实也没有什么棘手的。例如,这完全没问题
typedef struct Foo {
char *data;
int stuff;
} Foo;
struct Foo f1; /* <- declares a `struct Foo` object */
Foo f2; /* <- also declares a `struct Foo` object */
struct Foo *f3; /* <- declares a pointer to `struct Foo` */
Foo *f4; /* <- also declares a pointer to `struct Foo` */
Run Code Online (Sandbox Code Playgroud)
至于将指针类型隐藏在 typedef 名称后面……这是一个有争议的做法,许多人不赞成,即使 typedef 名称与结构标记不同。我个人更喜欢避免做这样的事情。使用与结构标记名称一致的类型名称来指定指针类型(如您的示例中所示)会使情况变得更糟。如果您真的想这样做,请为 typedef 名称指定独特的拼写,如
typedef struct Foo {
char *data;
int stuff;
} *FooPtr;
FooPtr f5; /* <- declares a pointer to `struct Foo` */
Run Code Online (Sandbox Code Playgroud)
但同样,通过隐藏*新类型名来掩盖指针类型是指针类型这一事实感觉就像会对代码的可读性产生负面影响。当需要创建“不透明”类型,某种“句柄”,其指针性质完全无关紧要时,这样的事情可能会很好地工作。但是对于常规指针,最好避免这样做。
这是几年前的标准做法吗?
还不如就我知道:这是更典型的是typedef在struct它的标签名,而不是一个struct指针。
有什么我想念的吗?似乎混淆了
struct指针,确实是一种很糟糕的风格。
您是完全正确的:typedef类似这样的内容很可能会使您的读者感到困惑。