【问题标题】:What does this C code mean?这个 C 代码是什么意思?
【发布时间】:2013-07-07 20:11:54
【问题描述】:

我知道 typedef'ing 允许您在不使用 struct 关键字的情况下引用结构。但是,有了这个:

typedef struct SYSTEM SYSTEM;

我在 C API 中看到过这个 typedef,但是 struct SYSTEM 之前没有定义过。

事实上,仅包含该行的.c 文件将自行编译。

编译器认为SYSTEM (or struct SYSTEM) 实际上是什么?

非常感谢!

【问题讨论】:

  • 你在 18 分钟前问过这个问题。它已被关闭。你为什么要转发它,认真的?
  • @H2CO3:这是因为他后来更新了问题,没有人回答这个问题……更新的问题不是重复的,它不应该被关闭。并且因为那里没有答案,所以也不应该将其作为副本关闭。哦,好吧,这很复杂。
  • @hacks 应该花一些时间来投票支持关闭问题和否决票。
  • @hacks 我问你是为了支持我的评论;),抱歉误解了

标签: c struct typedef


【解决方案1】:

不需要定义结构。它只需要声明。您提供的 typedef 声明包含 struct SYSTEM 的声明。

所以相当于:

struct SYSTEM;

typedef struct SYSTEM SYSTEM;

多亏了这个 typedef,SYSTEM 现在命名了一个不完整的类型,所以你可以像SYSTEM * 一样在接口定义中使用它,而不需要暴露结构的实际定义,它可以保持私有:

public_header.h:

typedef struct SYSTEM SYSTEM;

SYSTEM * create_system();

int do_useful_thing_with(SYSTEM * system, int count, void * addr);

void destroy_system(SYSTEM * system);

private_impl.c:

#include <public_header.h>

struct SYSTEM { int a; char b[12]; float q; void * next; };

SYSTEM * create_system()
{ 
    SYSTEM * p = malloc(sizeof *p);
    if (p) { p->a = 2; p->q = 1.5; }
    return p;
}

void destroy_system(SYSTEM * system)
{
    free(system);
}

// etc.

【讨论】:

  • 谢谢!那么大概 API 程序员已经在接口的 API 端的某个地方定义了这个?
  • @James:它不是空的。它是未定义的。空结构是定义的结构,如struct Foo {};。我添加了一个解释;您可以将其用作不完整类型。
  • 被允许引用未定义结构的目的是让您可以创建指向该结构的指针 - 可能从该结构内创建(例如,这对于声明链表最有用)。跨度>
【解决方案2】:

这是一个典型的 C 结构,与 C++ 和 Java 等相反,直接在全局命名空间中定义类型。 C 结构不能仅通过其名称访问,因此需要 typedef 才能仅调用 SYSTEM SYSTEM

struct SYSTEM {
  ...
};
struct SYSTEM foo;   //legal
SYSTEM bar;   //illegal
typedef struct SYSTEM SYSTEM;   //give it a global name
SYSTEM baz;   //now it's legal

【讨论】:

    【解决方案3】:

    我会说这通常是不明智的行为,但要点是:

    typedef 类型 姓名

    ..这里的 typestruct SYSTEM,分配的名称是 SYSTEM

    通常会给 typedef 取一个不同于派生 typedef 的类型的名称。因此,许多代码维护者可能对这种行为持低评价。

    【讨论】:

    • 用对了就好,滥用就不好。好的用法通常正是 OP 所要求的(摆脱不必要的struct 混乱),不好的用法正是您所说的(给已经命名的东西任意命名)。
    • 调用 struct "clutter" 是对 C 中的类型系统和/或纯粹的惰性的严重误解。
    • 通常人们会给 typedef 取一个不同于派生 typedef 的类型的名称。 嗯,不。 typedef struct NAME NAME 是旧 C 代码中极为常见的习语。它是 DIY 语法糖,可以避免一遍又一遍地输入“struct”。没有错。
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多