C++ 没有后续结构定义的typedef结构名称
我在libelf库的C++ 没有后续结构定义的typedef结构名称,c++,c,struct,typedef,elf,C++,C,Struct,Typedef,Elf,我在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 __c
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);
在线程中,用户“展开”表示:
还要注意,虽然您的示例(和我的示例)省略了对结构的命名
实际上,当您希望提供>不透明类型时,命名它也很有用。然后在标题中有如下代码,例如:
typedef结构点代码>
点*Point_新(int x,int y)代码>
然后在实现文件中提供struct
声明
然而,我也无法在任何c文件中找到结构的定义
我错过了什么?typedef结构名称的用途是什么代码>没有结构定义?或者这是不可能的,我只是没有找到结构定义
编辑:
首先,感谢您的众多精彩回复。由于我的问题是双重的(至少),有两个答案:
我没有找到定义,因为我没有lib/private.h
文件(感谢@molbdnilo指出定义在那里)。我安装了elfutils
的源代码,而不是libelf
的源代码。似乎private.h
未包含在elfutils
源程序包中
来自@Acrasidae、@sfjac和@Matt McNabb的答案解释了概念背景(不透明类型、封装、最小化依赖性…)
对此的可能解释可能是,您的项目有一些预编译的库文件,其中包含struct Elf
的定义是否在decl.h中定义
例如:
在C++中,<>代码> struct Elf <代码>应该足以声明类型,这是返回指向该类型的指针所必需的全部。这样做通常是为了向头文件的用户隐藏实现,这些用户本身不会使用Elf
功能,但可能只是传递指针。在上以这种方式编码可以消除对未实际使用的头文件的不必要依赖。这种最小化页眉依赖关系的方法对大型C++项目中编译时间有很大影响。p>
正如其他人所提到的,typedef-struct-Elf-Elf
是一种C语言,允许您在将来的声明中省略struct
类型定义结构Elf Elf代码>是一种简短的书写方式:
struct Elf;
typedef struct Elf Elf;
这些线做不同的事情。第一种通常称为远期申报。这意味着我们以后可以有如下代码:
// function prototype
struct Elf *elf_begin( stuff.... );
它原型化了一个函数,该函数返回指向struct Elf
的指针,尽管我们实际上不知道struct Elf
的主体中包含什么。这有时被称为不透明类型,它的另一个实例是C标准库中的FILE*
。任何地方都可能没有struct Elf
的定义
第二部分,typedef-struct-Elf-Elf正如您在问题中所说,code>主要是为了避免一直键入struct
我错过了什么?typedef结构名称的用途是什么;没有结构定义?或者这是不可能的,我只是没有找到结构定义
在libelf.h中,有一个不透明类型的声明:Elf
但是,您找不到Elf结构的定义,您想知道为什么
首先,在某个地方有一个定义,它看起来像struct Elf{…};,但是,您无法访问该定义,因为开发人员不希望您访问它。使用Elf结构内容的唯一方法是,因为存在以下声明:typedef struct Elf Elf;,在libelf.h。顺便说一下,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是做什么的,所以我无法在这方面帮助您)。
关于封装的目的,我建议您阅读
我没有别的想法,但如果你有更多的问题,不要犹豫。也许它是在你没有检查过的另一个头文件中定义的?typedef struct X
只是一个惯例,它可以防止在每次使用C之前写入struct
,我想这个定义是肯定的。也许这个库是一个没有源文件的预编译库?@EugeneSh我做了一个apt-get-source
来获取源文件。文件夹中有很多.c
文件…定义应该在“private.h”中。我使用获取源代码。如何检查是否有预编译的文件?假设你是对的,你能从这样的预编译文件中获得结构定义吗?点击libelf/decl.h
!什么是dtrace?为什么decl.h
不是libelf源代码的一部分呢?您写道“可能在任何地方都没有struct Elf的定义”。我假设这里可能是这种情况,因为Elf
类型是“Elf文件的描述符”。从实用的角度来看,Elf头的结构定义应该足够了。McNabb:我不确定您的说法“可能在任何地方都没有定义”。请参阅@Acrasidae的答案和评论。你能介绍一下你的工作吗