包括 c/c++ 中的结构和编译

Including struct and compilation in c/c++

本文关键字:结构 编译 c++ 包括      更新时间:2023-10-16

我注意到,在编译和链接在头文件中包含结构的代码时,结构声明实际上仅用于编译。 假设我有一个 struct.h 文件,我可以在编译和链接之间用空文件替换它,没有任何问题。

我的问题是:编译器到底在做什么?我想使用结构的每个 .o 文件中都必须有一个结构完整声明的副本,我想知道它如何确保它始终是相同的结构。

奖励问题:有没有办法在链接之前重新定义结构?

我认为有很多方面让你感到困惑。 从根本上说,结构只是在内存块中将多个相关变量映射在一起的一种方式。 因此,如果您有这样的结构:

struct x {
int a;
int b;
}

然后你使用该结构,编译器在内部实际上是为整个结构创建一个内存点。 它的大小取决于系统、编译器等,但假设一个int长 4 个字节(32 位)。 通常情况下,当您访问时,编译器正在执行的操作myvar.b它实际上将 4 个字节引用到存储 myvar 的内存位置。

但这都是在编译时完成的,编译器将 C(或 C++)代码转换为目标文件。 它实际上并没有将结构本身存储到目标文件中,只是将访问内存部分所需的偏移量存储。 因此,链接根本不需要了解结构,这就是为什么如果您在链接期间从 .h 中删除结构,则不会有任何变化:因为链接器甚至不读取该文件。