4

我从遗留代码库中遇到了一些 C 代码,这让我摸不着头脑。

代码到处都有 typedef 的结构,如下所示。

typedef struct Foo {
    char *data;
    int  stuff;
} *Foo;

这与 GCC 编译得很好。

我的问题是将结构类型定义为结构指针的目的是什么?这是几年前的标准做法吗?有什么我想念的吗?这似乎是一种非常糟糕的风格,因为它混淆了结构指针。任何有助于理解此遗留代码的帮助将不胜感激。

4

3 回答 3

7

这不是您的问题的直接含义。是专门关于名称相同的吗?或者它是关于在一般的 typedef 名称后面隐藏指针类型?

第一部分实际上不是问题,因为struct FooC 语言中的声明不引入 name FooFoo是一个所谓的struct tag,不能单独使用。struct Foo声明引入的类型全名是struct Foo,即structFoo都是构成类型全名的必要条件。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` */

但是同样,通过隐藏新类型名来掩盖指针类型是指针类型的事实*感觉就像会对代码的可读性产生负面影响。当需要创建“不透明”类型,某种“句柄”,其指针性质完全无关紧要时,这样的事情可能会很好地工作。但是对于常规指针,最好避免做类似的事情。

于 2013-10-29T21:52:00.007 回答
5

这是几年前的标准做法吗?

据我所知,它对它的标签名称更为典型typedefstruct但不是struct指针。

有什么我想念的吗?这似乎是一种非常糟糕的风格,因为它混淆了struct指针。

你是绝对正确的:typedef这样很可能会让你的读者感到困惑。

于 2013-10-29T20:45:43.113 回答
2

这是非常糟糕的做法。在许多领域,尤其是在计算机科学领域,通常最好只使用一个名称来指代同一事物。

这个 typedef 只会让代码维护者感到困惑:无论何时使用Foo,它实际上都是一个指向struct Foo. 这很容易出错,而且绝对没有必要。一个更好的名字本来是FooPtr

这样做从来都不是标准做法。

于 2013-10-29T21:40:47.393 回答