我从遗留的代码库中遇到了一些C代码,让我摸不着头脑。
代码的typedef结构如下所示。
typedef struct Foo {
char *data;
int stuff;
} *Foo;
这与GCC编好。
我的问题是对结构指针进行typedef结构的目的是什么?这是几年前的标准做法吗?有什么东西我错过了吗?这似乎是非常糟糕的风格,因为它混淆了结构指针。任何帮助理解这些遗留代码都将非常感激。
答案 0 :(得分:4)
这是几年前的标准做法吗?
据我所知:typedef
struct
与其标记名称相比更为典型,而不是struct
指针。
我有什么遗失的东西吗?这似乎是非常糟糕的风格,因为它混淆了
struct
指针。
你是对的:这样的typedef
很可能会让你的读者感到困惑。
答案 1 :(得分:3)
这不是你的问题所关乎的。具体是关于名字是否相同?或者是关于隐藏typedef名称背后的指针类型?
第一部分实际上不是问题,因为C语言中的struct Foo
声明不会引入名称Foo
。 Foo
是一个所谓的结构标记,不能单独使用。 struct Foo
声明引入的完整类型名称为struct Foo
,即struct
和Foo
都需要形成该类型的全名。将此struct Foo
类型定义为较短的类型名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` */
至于隐藏typedef名称后面的指针类型......即使typedef名称与struct标签不同,这也是许多人不赞成的有争议的做法。我个人更愿意避免做这些事情。并且使用与struct标记名称一致的typename来指定指针类型(如在您的示例中)使其更糟糕。如果你真的想这样做,请给出typedef名称的独特拼写,如
typedef struct Foo {
char *data;
int stuff;
} *FooPtr;
FooPtr f5; /* <- declares a pointer to `struct Foo` */
但同样,通过将*
隐藏在新类型名称后面来模糊指针类型是指针类型的事实感觉就像会对代码的可读性产生负面影响。当需要创建一个“不透明”类型,某种类型的“句柄”,其指针性质完全无关紧要时,这样的事情可能会很好。但是通过常规指针,最好避免做类似的事情。
答案 2 :(得分:1)
这是非常糟糕的做法。在许多领域,尤其是计算机科学领域,通常只有一个名称可以指代相同的东西。
这个typedef除了混淆代码维护者之外什么都不做:每当你使用Foo
时,它实际上是指向struct Foo
的指针。这很容易出错,而且绝对没必要。一个更好的名字应该是FooPtr
。
这样做绝不是标准做法。