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

Posted

技术标签:

【中文标题】在 c/c++ 中包括结构和编译【英文标题】:Including struct and compilation in c/c++ 【发布时间】:2019-04-29 16:05:00 【问题描述】:

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

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

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

【问题讨论】:

这太不清楚了。 I can replace it with an empty file between compiling and linking - 链接器使用对象和库文件,它不使用源文件。 I wonder how it makes sure that it is always the same struct. - 没有。这就是发生未定义行为的时候。 您能否分享用于执行此类任务的确切命令行指令? 额外问题:您为什么要这样做? 【参考方案1】:

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

struct x 
    int a;
    int b;

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

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

【讨论】:

感谢您的回答。因此,如果我理解正确,目标文件存储结构的映射,并且如果目标文件中的函数被赋予具有相同名称的结构变量,即使该结构是在另一个中构建的,它将根据该映射读取/写入根据另一张地图归档。我想我很困惑,因为通常我认为头文件是未编译代码的一部分。当然,也有一些例外,比如内联函数,但是这在你学习 c/c++ 时会很明显地突出显示。

以上是关于在 c/c++ 中包括结构和编译的主要内容,如果未能解决你的问题,请参考以下文章

C/C++程序编译过程详解

C/C++程序编译过程详解

C#调用C/C++的dll,一个库中包括多个函数,每调用一个函数都要用DllImport加载吗?求大神

Android Gradle 项目中包括 Apache HttpComponents 的问题

在 Win 7 32 位和 64 位的桌面安装中包括 sql server compact

C / C ++编译器可以报告结构成员偏移量[重复]