C++中的声明,定义以及linkage

本文探讨了C++中translation unit的概念,解释了声明与定义的区别,并详细阐述了internal linkage和external linkage的含义。特别是,文章讨论了为何const全局变量默认具有internal linkage,这有助于理解C++中const变量的使用和编译过程。
摘要由CSDN通过智能技术生成

昨天肥海豚哥哥问了一个问题,为什么在 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. 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. 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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值