【问题标题】:typedef a struct to a point with the same name as the structtypedef 一个结构到一个与结构同名的点
【发布时间】:2013-10-29 20:42:30
【问题描述】:

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

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

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

使用 GCC 可以很好地编译。

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

【问题讨论】:

  • 不,虽然更好一点的是在名称中暗示它是一个指针,例如FooPtr
  • 您不是“将结构定义为结构指针”,而是将名称Foo 定义为struct Foo 指针。你不能“typedef a struct”,这没有任何意义。

标签: c gcc struct


【解决方案1】:

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

第一部分确实不是问题,因为 C 语言中的 struct Foo 声明不会引入名称 FooFoo 是一个所谓的struct tag,不能单独使用。 struct Foo 声明引入的类型全名是struct Foo,即structFoo 都需要构成类型的全名。将这个struct Foo 定义为一个更短的类型名称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 标记名称一致的类型名称来指定 pointer 类型(如您的示例中所示)会使情况变得更糟。如果您真的想这样做,请为 typedef 名称提供独特的拼写,如

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

FooPtr f5; /* <- declares a pointer to `struct Foo` */

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

【讨论】:

    【解决方案2】:

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

    据我所知:typedef 更典型的是 struct 对其标记名称,而不是 struct 指针。

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

    您说的完全正确:像这样的typedef 很可能会让您的读者感到困惑。

    【讨论】:

      【解决方案3】:

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

      这个 typedef 只会让代码维护者感到困惑:每当你使用 Foo 时,它实际上是一个指向 struct Foo 的指针。这很容易出错,而且绝对没有必要。一个更好的名字应该是FooPtr

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-02
        • 2019-05-31
        • 2017-06-16
        • 2013-12-23
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 2012-09-11
        相关资源
        最近更新 更多