C++翻译单元

news/2025/3/12 2:12:04/文章来源:https://www.cnblogs.com/ydqblogs/p/18766586

在C++中,翻译单元(Translation Unit)是编译器处理的基本单位,它由一下内容组成:

1.翻译单元的定义

  • 翻译单元=一个源文件(.cpp)+所有它直接或间接包含的头文件(.h)
  • 预处理后的结果:在编译开始前,预处理器会将所有#include指令替换为对应头文件的内容,展开宏,处理条件编译(#ifdef等),最终生成一个完整的、无预处理指令的代码文本,这就是一个翻译单元。

2.翻译单元的生成过程

假设有以下代码

//main.cpp
#include "header.h"void func() {}int main() {func();return 0;
}
#ifndef __HEADER_H_
#define __HEADER_H_void func();#endif

预处理器处理main.cpp时:

  • 1.#include "header.h"替换为header.h的内容
  • 2.最终生成的翻译单元为:
ydqun@ydqhost translation_unit % g++ -E main.cpp                                                                            [0]
# 0 "main.cpp"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "main.cpp"
# 1 "header.h" 1void func();
# 2 "main.cpp" 2void func() {}int main() {func();return 0;
}

每个.cpp文件都会成圣一个独立的翻译单元。

3.翻译单元的关键作用

  • 编译的独立单位:编译器杜哥翻译单元进行编译,生成对应的目标文件(.obj/.o)。
  • 单一定义规则(ODR):全局变量、函数、类等实体的定义(非声明)在整个程序的所有翻译单元中必须唯一
  • 例如:若在头文件中定义全局变量int x;,多个包含该头文件的翻译单元会导致链接错误(重复定义)。
  • 解决方法:在头文件中用inlineextern声明变量,在.cpp中定义。

4.翻译单元和程序的关系

  • 编译阶段:每个翻译单元独立编译为对象文件。
  • 链接阶段:链接器将所有对象文件合并,解析符号引用(如函数调用、全局变量访问),生成最终可执行文件或库。

5.翻译单元相关的典型问题

  • 重复定义错误:
//header.h
int x = 10;  //错误:多个翻译单元包含次头文件会导致x重复定义。

正确做法

//header.h
extern int x; //声明
//source.cpp
int x = 10;  //定义
  • 内敛函数(inline):内敛函数的定义必须出现在所有使用它的翻译单元中(通常直接卸载头文件中)。
  • 模板实例化:模板需要在每个使用它的翻译单元中课件(因此模板通常定义在头文件中)。

6. 总结

  • 翻译单元是编译器处理的最小单位,决定了代码的作用域、可见性和链接行为。
  • 理解翻译单元是掌握 C++ 编译模型、头文件包含机制和单一定义规则(ODR)的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Palera1n之苹果手机越狱,iOS15~iOS 18有根越狱方法

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。其他越狱方式可参考:https://www.cnblogs.com/codtina/可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支…

Palera1n苹果手机越狱,iOS15~iOS 18有根越狱方法

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。其他越狱方式可参考:https://www.cnblogs.com/codtina/可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支…

Palera1n iOS15.8.2~iOS 18有根越狱教程

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支持 arm64e 设备。A11设备在使用前需要关闭锁屏密码,如…

POV vs FPV All In One

POV vs FPV All In One FPV 只是 POV 的一种特殊形式 ✅ point-of-view 视点 first-person view 第一人称视角POV vs FPV All In OneFPV 只是 POV 的一种特殊形式 ✅FPV is similar to the POV drone shot—however, the equipment makes the shooting experience quite differ…

【CodeForces训练记录】Codeforces Round 1009 (Div. 3)

训练情况赛后反思 大翻车,C题打表直接开猜,D题想到了转化行贡献再线段覆盖,但是不会算时间复杂度没敢写,后来试了一发给过了 A题 显然四个点都在坐标轴上,构成正方形只有四个数相等的情况点击查看代码 #include <bits/stdc++.h> // #define int long long #define e…

Cilium Ingress及插件的高级特性

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.启用Cilium Ingress Controller1.Cilium Ingress Controller概述2.启用Cilium Ingress Controller3.部署metallb组件4.测试Ingress规则之dedicated模式5.测试Ingress规则之shared模式二.Cilium高级特性…

pycharm基础使用方法

https://blog.csdn.net/MikexunP/article/details/89414928 基本配置 我们安装好PyCharm后,首先要进行一些小配置,比如主题,字体,字体颜色等。 我们打开PyCharm后,点开file,找到Setting 然后就会跳出Setting的窗口 可以说PyCharm的各种配置都需要在这里配置,现在我们进入…

FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 ️

title: FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 🛠️ date: 2025/3/12 updated: 2025/3/12 author: cmdragon excerpt: 我们将涵盖常见的错误类型、如何捕获和处理这些错误、以及如何返回自定义的错误消息。通过实例和最佳实践,您将能够有效地应对…

基于Flask的Web应用开发

基于Flask的Web应用开发项目来源:[【基于Flask的Web应用开发-01.应用介绍及Flask安装_s】](【基于Flask的Web应用开发-01.应用介绍及Flask安装_s】 https://www.bilibili.com/video/BV1r94y1j7uW/?share_source=copy_web&vd_source=d0886da49a29063777f2956d5780b087) 原…

vitest遇到的一个小问题:scrollTo is not a function

给tdesign-mobile-vue提了一个pr,验收通过了但是单测流水线报错了看报错是组件里的错误,scrollTo is not a function 组件代码的大概逻辑如下 const navScroll = ref<HTMLElement>(); // ... if (navScroll.value) {const tab = navScroll.value.querySelector < HT…

《Python极客编程 : 用代码探索世界》 | PDF免费下载

16个有趣的编程项目,项目式的学习方法,有趣案例提升Python编程技能,培养解决现实问题的思维,附赠源代码,适合零基础计算机小白入门学习。点击下载书籍信息 作者: [美]李沃恩(Lee Vaughan) 出版社: 人民邮电出版社 副标题: 用代码探索世界 译者: 王海鹏 出版年: 2022-8-1…

密度大于0.9408

题目: from Crypto.Util.number import * import random from Crypto.Cipher import AES import hashlib from Crypto.Util.Padding import pad from secrets import flaglist = [] bag = [] p=random.getrandbits(64) assert len(bin(p)[2:])==64 for i in range(4):t = pa=[g…