我从遗留代码库中遇到了一些 C 代码,这让我摸不着头脑。
代码到处都有 typedef 的结构,如下所示。
typedef struct Foo {
char *data;
int stuff;
} *Foo;
这与 GCC 编译得很好。
我的问题是将结构类型定义为结构指针的目的是什么?这是几年前的标准做法吗?有什么我想念的吗?这似乎是一种非常糟糕的风格,因为它混淆了结构指针。任何有助于理解此遗留代码的帮助将不胜感激。
这不是您的问题的直接含义。是专门关于名称相同的吗?或者它是关于在一般的 typedef 名称后面隐藏指针类型?
第一部分实际上不是问题,因为struct Foo
C 语言中的声明不引入 name Foo
。Foo
是一个所谓的struct tag,不能单独使用。struct Foo
声明引入的类型全名是struct Foo
,即struct
和Foo
都是构成类型全名的必要条件。struct Foo
将其定义为更短的 typename ,Foo
可以单独使用,这是一种广泛且相当有用的做法。没有什么不寻常的地方,而且 typename 的拼写与 struct 标签的拼写一致这一事实也没有什么棘手的。例如,这会很好
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` */
至于将指针类型隐藏在 typedef 名称后面……这是一个有争议的做法,许多人不赞成,即使 typedef 名称与 struct 标签不同。我个人更喜欢避免做这样的事情。并且使用与 struct 标记名称一致的类型名称来指定指针类型(如您的示例中所示)会使情况变得更糟。如果您真的想这样做,请为 typedef 名称提供独特的拼写,如
typedef struct Foo {
char *data;
int stuff;
} *FooPtr;
FooPtr f5; /* <- declares a pointer to `struct Foo` */
但是同样,通过隐藏新类型名来掩盖指针类型是指针类型的事实*
感觉就像会对代码的可读性产生负面影响。当需要创建“不透明”类型,某种“句柄”,其指针性质完全无关紧要时,这样的事情可能会很好地工作。但是对于常规指针,最好避免做类似的事情。
这是几年前的标准做法吗?
据我所知,它对它的标签名称更为典型typedef
,struct
但不是struct
指针。
有什么我想念的吗?这似乎是一种非常糟糕的风格,因为它混淆了
struct
指针。
你是绝对正确的:typedef
这样很可能会让你的读者感到困惑。
这是非常糟糕的做法。在许多领域,尤其是在计算机科学领域,通常最好只使用一个名称来指代同一事物。
这个 typedef 只会让代码维护者感到困惑:无论何时使用Foo
,它实际上都是一个指向struct Foo
. 这很容易出错,而且绝对没有必要。一个更好的名字本来是FooPtr
。
这样做从来都不是标准做法。