在c / c ++中包含struct和compilation

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c / c ++中包含struct和compilation相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

struct x {
    int a;
    int b;
}

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

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

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

不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件

为啥标识符可以在 C 中包含“$”? [复制]

在使用 C++ 和 Java 的 Android 应用程序中包含 TFLite C API 时的构建问题

在cmake的所有cpp文件中包含c ++标头[重复]

在 Simulink 的自定义代码部分中包含 c 库

在C ++命名空间中包含旧库