2010-07-09 35 views
0

可能重复:
How does a compiled C++ class look like?结构的编译定义如何在C中看起来像?

大家好,

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

+4

重复的[编译的C++类如何看起来像?](http://stackoverflow.com/questions/3211262/how-does-a-compiled-c-class-look-like)由同一用户发布 – 2010-07-09 10:45:45

+0

真的,我只是想从C++转移焦点,并理解一些更基本的结构。所以开始了一个新的帖子,摆脱以前的混乱。 – xyz 2010-07-09 11:04:44

回答

2

那么struct 的定义真的在哪里去?

结构定义通常为/dev/null。 C没有任何内省功能,所以在运行时不需要struct定义。编译期间,对结构字段的调用将转换为数字偏移量,例如。 x->f将被编译为相当于*((void*)x + sizeof(int))。这就是为什么每次使用struct时都需要包含头文件的原因。

+0

谢谢el.pescado。你在对这个问题的评论中解决了我的问题。 – xyz 2010-07-09 11:31:37

+0

你的意思是'*(float *)((char *)x + sizeof(int))'。指针运算和解除引用'void *'都是无效的。 – 2010-07-09 14:55:48

4

没有什么。它不存在。你什么也没创造,什么也不用。

结构的定义在编译时使用。该定义通常会放置在未编译的头文件中。这是当一个结构是使用一些代码生成。该定义影响什么编译器产生的点。

除此之外,这也是为什么针对某个库版本进行编译,然后在运行时使用另一个版本会导致程序崩溃的原因。

+1

除了可能包含调试信息(如果您生成的话) - 尽管没有使用它甚至可能不会去那里。 – Rup 2010-07-09 10:48:30

+0

Hi Borealid, 的确,通常这样的文件将作为头文件包含在内,不太可能自行编译。但是说我编译它并使用这个目标文件编译另一个文件说main.c使用这个结构的定义(我可以做到这一点,对吗?)。那么在这种情况下,在目标文件struct.o中应该有一些东西,它告诉编译main.c时struct.c中有什么。 – xyz 2010-07-09 10:53:26

+1

@learnerforever:不,结构声明*总是从头文件中获取。这就是为什么您必须始终包含头文件的原因。 – 2010-07-09 10:59:02

2

结构不编译,它们被声明。函数得到编译。

2

我不是专家,我实际上不能回答这个问题......但我想到了这一点。内存是内存:如果使用1个字节作为整数或字符,它仍然是一个字节。结果仅取决于编译器。 那么,结构为什么不能相同呢?我的意思是,编译器可能会计算内存分配(因为你的计算机可能会分配内存的话,而不是字节,如果你的结构是1字节长,可能会添加3个字节,允许分配4字节的字),和那么struct在访问数据时就会成为你的“参考”。 我认为没有必要在底层实际上有一些东西:编译器足够了解在编译时,如果你引用了你的结构体的字段“name”,它应该把它当作一个长度为字符的数组X.

正如我所说的,我并不擅长这样的内部构件,但正如我所看到的,不需要将结构转换为“真实代码”......它只是编译器的注释,编译完成后可以销毁。

+0

就是这样; +1为受过教育的猜测。 :) – 2010-07-09 10:51:49