Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有后续结构定义的typedef结构名称_C++_C_Struct_Typedef_Elf - Fatal编程技术网

C++ 没有后续结构定义的typedef结构名称

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库的
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主要是为了避免一直键入
    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的答案和评论。你能介绍一下你的工作吗