包括 c/c++ 中的结构和编译
Including struct and compilation in c/c++
我注意到,在编译和链接在头文件中包含结构的代码时,结构声明实际上仅用于编译。 假设我有一个 struct.h 文件,我可以在编译和链接之间用空文件替换它,没有任何问题。
我的问题是:编译器到底在做什么?我想使用结构的每个 .o 文件中都必须有一个结构完整声明的副本,我想知道它如何确保它始终是相同的结构。
奖励问题:有没有办法在链接之前重新定义结构?
我认为有很多方面让你感到困惑。 从根本上说,结构只是在内存块中将多个相关变量映射在一起的一种方式。 因此,如果您有这样的结构:
struct x {
int a;
int b;
}
然后你使用该结构,编译器在内部实际上是为整个结构创建一个内存点。 它的大小取决于系统、编译器等,但假设一个int
长 4 个字节(32 位)。 通常情况下,当您访问时,编译器正在执行的操作myvar.b
它实际上将 4 个字节引用到存储 myvar 的内存位置。
但这都是在编译时完成的,编译器将 C(或 C++)代码转换为目标文件。 它实际上并没有将结构本身存储到目标文件中,只是将访问内存部分所需的偏移量存储。 因此,链接根本不需要了解结构,这就是为什么如果您在链接期间从 .h 中删除结构,则不会有任何变化:因为链接器甚至不读取该文件。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- C++编译大型结构时内存使用过多
- 如何在 C++11 编译时构建具有递增值的整数成员的结构序列
- C 嵌套结构上的 g++ 编译错误
- 无法在窗口上编译结构 - 缺少 ltdl.h
- 编译时检查以确保结构中的任何位置都没有填充
- Rcpp - 在包结构之外编译
- 当编译时已知引用占用结构中的空间时,是否错过了优化?
- 尝试初始化结构向量时出现编译错误
- ARM C++编译器不会编译具有可变常量成员的结构
- Jetson 工具链文件夹结构和交叉编译时的 libgomp 链接器错误
- std::结构复杂,使编译速度变慢
- 为什么我无法编译结构化绑定?
- 如何修复编译由结构组成的 std::p air 时出现的错误
- NVCC编译了特征库,并在运行时失败的结构中的MatrixxD大小
- 将类似JavaScript的结构编译为静态,快速C++的最佳方法是什么?
- 使用数组和"结构"编译错误?
- 它无法将 c++ 映射结构编译为 map<A、pair<B、C> >
- Boost精灵规则与phoenix绑定到结构编译失败