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;
的目的是什么?或者这是不可能的,我只是没有找到结构定义?
编辑:
首先,感谢您的众多精彩回复。由于我的问题是双重的(至少),所以有两个答案:
- 我没有找到定义,因为我没有
lib/private.h
文件(感谢@molbdnilo 指出定义在那里)。我安装了 elfutils
而不是 libelf
的源代码。 private.h
似乎没有包含在 elfutils
源码包中。
- @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。
我没有别的想法,但如果您有更多问题,请不要犹豫。
我在 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;
的目的是什么?或者这是不可能的,我只是没有找到结构定义?
编辑:
首先,感谢您的众多精彩回复。由于我的问题是双重的(至少),所以有两个答案:
- 我没有找到定义,因为我没有
lib/private.h
文件(感谢@molbdnilo 指出定义在那里)。我安装了elfutils
而不是libelf
的源代码。private.h
似乎没有包含在elfutils
源码包中。 - @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。
我没有别的想法,但如果您有更多问题,请不要犹豫。