大家好,
bash$cat struct.c
struct test
{
int i;
float f;
};
bash$gcc -c struct.c
目标文件struct.o是elf格式。我试图了解此对象文件包含什么。源代码只是结构的定义。这里没有任何可执行文件,所以文本中没有任何内容,也没有任何数据。 那么struct的定义到底在哪里呢?
我尝试过使用;
readelf -a struct.o
objdump -s struct.o
但不太明白这一点。
谢谢,
Jagrati
答案 0 :(得分:4)
什么都没有。它不存在。你什么也没做,什么也没用。
结构的定义在编译时使用。该定义通常放在未编译的头文件中。当结构使用时,会生成一些代码。该定义影响编译器在 点生成的。
除了其他原因之外,这是为什么针对一个版本的库进行编译然后在运行时使用另一个版本会导致程序崩溃。
答案 1 :(得分:2)
结构体未编译,它们被声明。函数可以编译。
答案 2 :(得分:2)
我不是专家,我实际上无法回答这个问题......但我想到了这一点。 内存是内存:如果使用1字节作为整数或字符,它仍然是一个字节。结果仅取决于编译器。 那么,为什么结构不能相同呢?我的意思是,编译器可能会计算要分配的内存(因为你的计算机可能会分配内存的WORDS,而不是字节,如果你的结构是1字节长,可能会添加3个字节,允许分配4个字节的字),以及那么struct在访问数据时只是你的“参考”。 我认为没有必要真正掌握下面的东西:编译器知道在编译时,如果你引用结构的字段“name”就足够了,它应该被视为长度为X的字符数组
正如我所说,我不是这种内部的专家,但正如我所看到的,不需要在“真实代码”中转换结构......这只是编译器的注释,它可以在编译完成后被销毁。
答案 3 :(得分:2)
那么struct的定义在哪里? 去了吗?
结构定义通常转到/dev/null
。 C没有任何内省功能,因此在运行时不需要结构定义。在编译期间,对结构字段的调用将转换为数字偏移,例如。 x->f
将被编译为等同于*((void*)x + sizeof(int))
。这就是每次使用struct时都需要包含标题的原因。