在这里简单写下我对翻译单元的认识。

我的理解,翻译单元(translation unit)就是一个源代码文件,或者说是经过预处理器宏展开后得到的源码文件。在别人的博客中看到过

translation unit(翻译单元)也可称为compilation unit(编译单元),translation unit是C预处理后的输出,即一个源文件经过预处理后.
经过translation unit后产生一个目标文件(比如.c通过编译产生.o文件)

我个人的理解,一个翻译单元,至少是能够用编译器单独编译成.o文件的,因此有时候把函数定义或者类成员函数的定义放在单独的代码文件中时候,时候包含头文件与否要看是否能够单独将文件编译通过。例如类成员方法的文件中就应该要包含类定义的头文件,不然单独编译这些成员函数的时候,所操作的成员变量以及类名称都没告诉编译器,怎么让编译器给你编译?
但是有些时候例如使用关键字extern声明的引用声明,是可以进行编译的,我的理解就是编译器看到类似声明的变量或者函数的时候,应该会认为这个变量虽然在本单元中没有提供,但是链接器会把这个变量从其他的地方找到,因此就不报错了。估计调用在其他地方定义的函数也是类似的原因,反正有函数原型了,能不能执行函数就看连接器的了,我编译器就不管了(纯属个人意淫。

Comments

2016-02-17