【问题标题】:How to "look into" a struct?如何“查看”结构?
【发布时间】:2016-04-08 15:09:21
【问题描述】:

stdio.h 中定义的FILE 类型为例:有什么方法可以在不查看标题的情况下获取有关其字段(名称、大小、偏移量等)的信息?有时使用这样的函数/宏来检查结构的组件会很方便。

【问题讨论】:

  • 不,这样的元信息不能从 C 程序中获得。
  • 也许您应该针对您认为有用的情况提出一个新问题 - 您可能会发现更好的做事方式。
  • 如果使用调试信息和支持它的格式编译,请查看目标文件。但这看起来像是一个 XY 问题。
  • FILE 是不透明的并且依赖于实现 - 不要使用它的字段。

标签: c struct


【解决方案1】:

没有。

C 中没有与数据结构相关的元数据,所有这些在编译时都会丢失。

而且很有可能,因为FILE 是不透明的,所以实际上没有公共标头具有定义。它可能只是库头中的typedef struct __FILE FILE;,然后所有细节都保存在里面,可能在你甚至没有源代码的代码中。

【讨论】:

  • 由于历史原因,FILE 通常被定义为 typedef struct _iobuf FILE
【解决方案2】:

简单的答案是。你必须有源代码。

【讨论】:

    【解决方案3】:

    在基于 C 的结构中,数据以非“自我定义”的方式存储 - 您必须知道结构定义才能解释数据。如果您的程序理解结构,这会将数据的大小减少到最低限度,并加快访问速度。

    【讨论】:

      【解决方案4】:

      答案是否定的。

      每当我需要查找有关结构数据成员的信息时,Header Filecomments 对我来说已经足够了。

      而且你不能有一个函数/宏来检查结构的组件,因为在 C 中没有与变量和过程相关联的元数据。

      【讨论】:

        【解决方案5】:

        查看有关其字段信息的唯一方法是拥有实际来源,或解释结构如何组织的 api/软件文档。

        【讨论】:

          【解决方案6】:

          这是不可能的。 C 不保留此类信息,可能是由于“你不为你不使用的东西付费”的原则;它还使语言保持简单和可移植。

          您最多可以通过offsetof 标准宏查询struct 中给定成员的位置。但是你必须知道字段的名称。

          【讨论】:

          • @OrangeDog 不,我的意思是从代码中解析它。它不必是 C。
          • 好吧,这是个糟糕的主意。
          • @OrangeDog 动机?我可能理解它的复杂性,但这不是一个真正的论点。无论如何,这与问题本身无关。
          • 在回答有关结构的 C 问题时,您建议编写代码来解析头文件。 C 语言本身就存在足够多的危险,而无需尝试编写一个自行编译以在运行时改变其行为的程序。
          • @OrangeDog 不,我没有:我刚刚给出了一个可能的解决方案。还有很多其他的。我会给你我不应该有的,因为它超出了问题的重点,因此我进行了相应的编辑。但是其余的答案仍然很好。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 2016-10-09
          • 2011-09-18
          相关资源
          最近更新 更多