为什么C程序每次引用时都会继续说'struct'?

Ale*_*x K 3 c compiler-construction language-design

虽然我很少编写C代码,但我经常会看到它(主要是由于我的领域中的书籍将其作为算法示例的参考语言)而且有些东西一直在讨论变量/参数的声明方式.最好的例子就是这个List有一个扭曲的例子,关于Linux内核中使用的Linked List的特定实现(抱歉,我最初有一个博客文章的链接,但显然博客文章已被删除,我从我复制的代码浏览器的缓存).

struct blog {
  ...
  struct ls posts;
};

struct post {
  ...
  struct ls blog_posts;
};

void delete_blog(struct blog *blog) {
  ...
  struct post *p;
  ls_for_each(&blog->posts, p, blog_posts) {
    free(p);
  }
  free(blog);
}
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,他们不断在任何地方重复关键字结构.我的意思是像ls,blog,post这样的东西被声明为结构体,那么每次声明一个变量或该类型的函数参数时,它是什么意思呢?这告诉编译器它不能从你实例化的东西被定义为结构的事实中推断出来了什么?

Jen*_*edt 6

struct标签与通常的标识符位于不同的名称空间中.所以struct关键字是指定它的必要条件.一个着名的例子是在POSIX中你有一个struct stat和一个函数stat.


Mat*_*Mat 5

好吧,这是因为如果没有typedef,那么这是引用结构的唯一方法.

在C中,如果你有:

struct thing {
  // stuff here
};
Run Code Online (Sandbox Code Playgroud)

并且您希望拥有该类型的变量,您需要:

  • 使用struct thing作为类型说明符
  • make typedef like typedef struct thing thing_t;thing_t用作类型说明符.

(C++在这方面有所不同.)