typedef struct name 没有后续结构定义的名称

typedef struct name name without a subsequent struct definition

我在 libelf 库的 libelf.h 的第 153-154 行找到了以下代码:

/* Descriptor for the ELF file.  */
typedef struct Elf Elf;

我一直在寻找 Elf 的结构定义,但没有找到。

稍后在代码中使用 Elf,例如

/* Return descriptor for ELF file to work according to CMD.  */
extern Elf *elf_begin (int __fildes, Elf_Cmd __cmd, Elf *__ref);

在话题 Why should we typedef a struct so often in C? 中,用户 "unwind" 说:

Also note that while your example (and mine) omitted naming the struct itself, actually naming it is also useful for when you want to provide an > opaque type. Then you'd have code like this in the header, for instance:

typedef struct Point Point;

Point * point_new(int x, int y);

and then provide the struct declaration in the implementation file.

然而,我也无法在任何 c 文件中找到结构 Elf 的定义。

我错过了什么?没有结构定义的 typedef struct Name_xy Name_xy; 的目的是什么?或者这是不可能的,我只是没有找到结构定义?


编辑:

首先,感谢您的众多精彩回复。由于我的问题是双重的(至少),所以有两个答案:

  1. 我没有找到定义,因为我没有 lib/private.h 文件(感谢@molbdnilo 指出定义在那里)。我安装了 elfutils 而不是 libelf 的源代码。 private.h 似乎没有包含在 elfutils 源码包中。
  2. @Acrasidae、@sfjac 和@Matt McNabb 的回答解释了概念背景(不透明类型、封装、最小化依赖性......)。

可能的解释是您的项目有一些预编译的库文件,其中包含 struct Elf.

的定义

是否在decl.h中定义?

例如:

http://www.opensource.apple.com/source/dtrace/dtrace-96/head/libelf.h http://www.opensource.apple.com/source/dtrace/dtrace-118/libelf/decl.h

在 C++ 中,struct Elf 应该足以声明类型,这是 return 指向该类型的指针所必需的。这通常是为了向 header 文件的用户隐藏实现,这些用户本身不会使用 Elf 功能,但可能只是传递指针。以这种方式编码消除了对 header 文件的不必要的依赖,这些文件实际上没有被使用。这种最小化 header 依赖关系的方法会对大型 C++ 项目的编译时间产生重大影响。

正如其他人所提到的,typedef struct Elf Elf 是 C 的东西,允许您在以后的声明中省略 struct

typedef struct Elf Elf;是简写法:

struct Elf;

typedef struct Elf Elf;

这些行做不同的事情。第一个通常称为 前向声明。这意味着我们以后可以有这样的代码:

// function prototype
struct Elf *elf_begin( stuff.... );

一个函数的原型是 returns 指向 struct Elf 的指针,尽管我们实际上并不知道 struct Elf 的主体中包含什么。这有时被称为 opaque type,它的另一个实例是 C 标准库中的 FILE *。任何地方都可能没有 struct Elf 的定义。

第二部分,typedef struct Elf Elf;,正如你在问题中所说,主要是为了避免一直输入 struct

What am I missing? What is the purpose of a typedef struct Name_xy Name_xy; without struct definition? Or is this impossible and I just did not find the struct definition?

在 libelf.h 中,您有一个不透明类型的声明:Elf。

但是,您没有找到Elf结构体的定义,您很纳闷为什么。

首先,某处有一个定义,看起来像struct Elf{...};,然而,你无法访问定义,因为开发人员不希望您访问它。您可以使用 Elf 结构的内容的唯一方法是因为在 libelf.h 中有此声明 typedef struct Elf Elf;。顺便说一下,struct Elf; 完全一样,但是通过 typedef 我们知道类型不透明的可能性更大。

一个更生动的例子:

头文件:

/* libelf.h */
typedef struct Elf Elf;
extern Elf *elf_begin (int __fildes, Elf_Cmd __cmd, Elf *__ref);
etc...

实现文件:

/* libelf.c */
struct Elf {
  char * something;
  FILE * whatever;
};

Elf *elf_begin (int __fildes, Elf_Cmd __cmd, Elf *__ref){
  /*doing something;*/
  /* ... */
}
etc...

这正是封装的原理。这种类型的内容只有 API 函数的实现是已知和可访问的,客户端(你)不能直接访问它的内容。对于开发人员来说,他们必须编译一个共享库,所以你可能会在某处找到类似 libelf.so 的东西(我不知道 libelf 做了什么,所以我无法帮助你)。 关于封装的目的,建议大家阅读this

我没有别的想法,但如果您有更多问题,请不要犹豫。