GCC - 打印结构的定义

时间:2016-10-15 10:56:12

标签: c gcc c-preprocessor preprocessor-directive

C 程序是否可以打印结构的定义?成员名称很棒,但只是一个有序的数据类型列表(以及数组中的数组长度)就足够了。

我一直在寻找预处理程序指令来实现这一点,但找不到任何指令。是否有预处理程序指令可以获取带注释的代码部分并将其用作#define变量。如果是这样,我可以初始化一些sting变量来保存#define变量的值。

例如,像这样的结构按原样打印

struct foo{
int a;
char b;
short arr[6];
}

或者像这样

struct s{
int m1;
char m2;
short m3[6];
}

只要可以从数据中重新创建结构,格式化就不重要了。所以这样的事情也很好:

s{int,char,short[10]}

仅供参考,这是一个资源受限的基于ARM的设备。

我不想手动将结构代码粘贴到print语句中。如果结构代码发生更改,并且print语句未更改,则会产生错误的结果。

2 个答案:

答案 0 :(得分:1)

如果您已有源代码,为什么要这样做?

但总的来说,C编译器不提供选项,例如: "列表"它在编译过程中看到的所有结构。编译器将保留内部符号表,但没有人想到任何需要能够打印这些表。在编译期间读取的所有源文件和头文件中也可能有数百个结构和类型。

另请注意,类型,字段和变量的名称主要用于为程序员提供意义。编译后,很多名字都会消失。只有全局变量和缺少的外部变量才会在目标文件中保留其名称,以便在链接期间解析这些变量,并且在链接之后,不再需要这些名称。例如,编译器将a->b转换为b的偏移量,与a所在的内存中的位置相关联。

答案 1 :(得分:1)

目标文件格式包含您需要的信息,并允许以编程方式访问。其中一个是Dwarf。调试器通常使用此信息。

我不认为(但我不确定)可以访问运行代码的调试信息。这与在Java或.net系列等复杂的运行时系统中运行的语言程序不同。那些可以使用自己的反思。

在用传统编译语言编写的程序中,您可能会打开一个目标文件 - 可能是正在运行的可执行文件! - 并以编程方式检查它,就像调试器一样。考虑到这一点,可以想象分析源代码更容易(在C和C ++中必须以头文件的形式提供许多类型定义)。但是对于非平凡的用途,这个想法可能是欺骗性的,因为编译器已经为你提供了解密和解析源,并将所有信息放在简洁的数据结构中,以便于访问它们。编译过程的这一部分 - 即前端的相当一部分 - 如果你对资源进行操作,则必须由你完成。