Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 如何";调查;结构?_C_Struct - Fatal编程技术网

C 如何";调查;结构?

C 如何";调查;结构?,c,struct,C,Struct,以stdio.h中定义的文件类型为例:是否有任何方法可以在不查看标题的情况下获取有关其字段(名称、大小、偏移量等)的信息?有时,使用这样的函数/宏来检查结构的组件会很方便。简单的答案是否定的。你必须有源代码。这是不可能的。C不保留此类信息,可能是因为“你不使用的东西你不付费”的原则;它还保持了语言的简单性和可移植性 您最多只能通过offsetof标准宏查询给定成员在struct中的位置。但是您必须知道字段的名称。否 在C中没有与数据结构相关的元数据,所有这些在编译时都会丢失 因为文件是不透明的,

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

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

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

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

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


因为
文件
是不透明的,所以没有公共头文件真正有定义,这是完全可能的。它可以是
typedef struct\u文件在库标题中,然后所有详细信息都保存在内部,可能是在您甚至没有源代码的代码中。

在基于C的结构中,数据以非“自定义”的方式存储-您必须知道结构定义才能解释数据。这将数据的大小减少到最小,并使访问速度更快,前提是您的程序理解其结构。

答案是否定的

每当我需要查找有关结构的数据成员的信息时,
头文件
和那边的
注释
就足够了


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

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

否,这样的元信息在C程序中是不可用的。也许你应该问一个关于你认为它有用的情况的新问题-你可能会发现一种更好的方法。如果使用调试信息和支持它的格式编译,请查看对象文件。但这看起来像是XY问题。
文件
不透明且依赖于实现-不要使用它的字段。@OrangeDog不,我的意思是从代码解析它。“不一定是C。好吧,那是个糟糕的主意。”奥兰吉多格说?我可能理解它的复杂性,但这不是一个真正的论点。在任何情况下,它都与问题本身无关。在回答一个关于结构的C问题时,您建议编写代码来解析头文件。C语言本身就有足够多的危险,如果不让程序自行编译以改变运行时的行为的话。@OrangeDog不,我没有:我刚刚给出了一个可能的解决方案。还有很多其他的。我会告诉你我不应该这样做,因为这超出了问题的重点,因此我已经相应地进行了编辑。但答案的其余部分仍然可以。由于历史原因,
FILE
通常被定义为
typedef struct\u iobuf FILE