昨天肥海豚哥哥问了一个问题,为什么在 c++ 中 const全局变量默认是static的,当时不是太清楚,查了一些资料,基本真相大白了。
这个问题应该重新表述为: 为什么在 c++ 中 const全局变量默认是internal linkage? 这样的表述更为恰当。
先不忙直接回答这个问题。通过这个问题,可以引申出以下几个子问题:
1. 什么是一个translation unit?
2. C++中的声明和定义(declaration and definition)之间是什么关系?
3. 什么是internal linkage 和 external linkage?
首先来看第一个问题:
1. 什么是一个translation unit?
看看wikipedia上的定义:
In C programming language terminology, a translation unit is the ultimate input to a C compiler from which an object file gets generated.
这个定义同样也来自C99 Standard。 之所以要强调translaton unit这个概念,是因为有不少人,包括我自己,都误认为在C/C++中,translation unit对应编译后生成的目标文件(比如.o 或.obj文件),但实际上它对应着源文件(比如.c/.cc/.cpp 等)。
接着下一个问题:
2. C++中的声明和定义(declaration and definition)之间是什么关系?
搞清楚基础概念的好方法是看标准,C++ Standard 2003 第3.1节有如下描述:
-
1 A declaration (clause 7) introduces names into a translation unit or redeclares names introduced by previous declarations. A declaration specifies the interpretation and attributes of these names.
-
2 A declaration is adefinitionunless it declares a function without specifying the function’s body (8.4), it contains theexternspecifier (7.1.1) or alinkage-specification24)(7.5) and neither aninitializernor a function-body,it declares a static data member in a class declaration (9.4), it is a class name declaration(9.1), or it is a