c++ - 在 c/c++ 中包括结构和编译

标签 c++ c struct compilation compiler-construction

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

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

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

最佳答案

我认为有多个方面让您感到困惑。从根本上说,结构只是一种将多个相关变量映射到一 block 内存中的方法。所以如果你有一个像这样的结构:

struct x {
    int a;
    int b;
}

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

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

关于c++ - 在 c/c++ 中包括结构和编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55907054/

相关文章:

c++ - 使用智能指针的双向链表

c++ - 正确答案但在效率阶段出现运行时错误

c++ - 错误 C2146 : syntax error : missing ';' before identifier 'vertices'

c++ - 使用 fork/execvp 和系统调用的区别

c# - Unity3D C# - 在结构/类中存储 Sprite ?

c++ - 在 C++ 中测量耗时时如何考虑断点?

c - sys/stat.h 中是否定义了 Mac 系统完整性保护

c - 如何使用 FFmpeg API 将多张图片合二为一?

带指针的 C++ 结构 : constructor and destructor

c - C中ListNode中的指针