1.什么是转换单元
程序中的每个.cpp文件和它包含的所有头文件称为一个转换单元。
编译器处理每个转换单元,生成二进制对象文件,用扩展名.obj来标识。
链接器将对象文件组合起来,生成一个可执行文件,用扩展名.exe来标识。

2.作用域
使用{}来限定变量的作用域

内部作用域可以定义一个和外部作用域相同的名称,此时,内部作用域中定义的名称,将隐藏外部作用域中的名称,

若要访问外层作用域中的名称,可使用解析运算符::,解析运算符的介绍,可参考 C++范围解析运算符::的使用

int main()
{
const int limit =;
std::cout<<"limit 1 is "<<limit<<std::endl;
{
const int limit = ;
std::cout<<"limit 2 is "<<limit<<std::endl;
std::cout<<"limit 3 is "<<::limit<<std::endl;
}
std::cout<<"limit 4 is "<<limit<std::endl;
}

输出结果:
limit 1 is 10
limit 2 is 5
limit 3 is 10
limit 4 is 10

3.转换单元的全局名称属性linkage
每个转换单元中的全局名称,都有一个属性linkage,该属性指明该全局名称可以在程序代码的什么地方使用。
内部链接属性:该名称只能在同一转换单元的任何地方访问。比如全局const变量。
外部链接属性:该名称除了在同一转换单元访问外,还可在其他的转换单元中访问。除了全局const变量,其他的全局名称都是外部链接属性的。

局部名称没有链接属性。

4.什么是“一个定义”规则
在所有的转换单元中,外部链接属性的全局名称,如变量、函数、类类型、枚举类型、模板都只能定义一次。
内联函数除外,内联函数的定义必须出现在调用该函数的每个转换单元中。

内部链接属性的名称可以在多个转换单元中同时定义。

5.如何访问另一转换单元中定义的变量
对于函数来说,如果函数的调用和定义不在同一个转换单元,编译器会把这个函数调用标记为外部的,让链接程序去处理它。

对于变量来说,是不同的。必须使用extern关键字来声明该变量。表示该变量的定义在另一个转换单元中。

示例代码如下:

myextern.cpp
int limit = ; mymain.cpp
int main()
{
extern int limit;
std::cout<<"Extern limit is "<<limit<<std::endl;
return ;
}

由链接属性linkage的介绍,我们知道const变量是内部链接属性的,只能在转换单元内部访问。

而定义一个const变量,希望其他的转换单元都可以使用的情况是常见的,如圆周率PI,const double pi=3.14159265,

那么,怎么才能让const变量也具有外部链接属性呢。
我们只需要在定义const变量时,也加上extern关键字就可以了。

示例代码如下:

myextern.cpp
extern const double pi=3.14159265; mymain.cpp
int main()
{
extern const double pi;
std::cout<<"Extern pi is "<<pi<<std::endl;
return ;
}

另外需要说明的是,extern变量声明的位置,决定了该外部变量的作用域。

参考资料:《C++入门经典 第三版》 pp.309-318

C++程序文件链接的更多相关文章

  1. 小程序中搜索文件,阅览pdf,分享文件链接,评论表情符号

    小程序中搜索文件,阅览pdf,分享文件链接,评论表情符号 https://blog.csdn.net/hotqin888/article/details/84111389 小程序中打开网页和pdf h ...

  2. linux下c程序的链接、装载和库(3)

    9. 目标文件放在一起-->静态库. 你的同事给出的目标文件太多了,从 one.o two.o …… …… 一直到 xxx.o. 好的,你如果真正想用,你的同事提供的这些现有的目标文件,你得做三 ...

  3. linux下c程序的链接、装载和库(1)

    读完<程序员的自我修养--链接.装载和库>相关章节,想来总结一下,若有错误,请指正,多谢. 1. 什么叫目标文件? 你的工程里有很多xxx.c这样的源文件,这些文件是文本文件,只有人能够认 ...

  4. 解决qt程序的链接阶段出现 undefined reference 错误

    错误的原因是我使用到了 QT Widgets 模块中的东西,但是makefile的链接的参数中没有 widgets.其实官网上提到了这个: http://doc.qt.io/qt-5/qtwidget ...

  5. 程序的链接和装入及Linux下动态链接的实现

    http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...

  6. Linux链接库四(多个库文件链接顺序问题)

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

  7. discuz X2.0教程]教你快速了解Discuz!程序文件功能,修改文件从此不用再求人

    x3.x数据字典 http://faq.comsenz.com/library/database/x3/x3_index.htm 先从根目录开始,根目录文件一般都是入口,即执行具体功能的代码一般不在这 ...

  8. c++应用程序文件的编译过程

    这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.     一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开include文件 ...

  9. [转]c++应用程序文件的编译过程

    原文地址 这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.    一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开inclu ...

随机推荐

  1. Java从零开始学十五(继承)

    一.继承作用 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法 ...

  2. JSTL 标签库 使用(web基础学习笔记十九)

    标签库概要: 一.C标签库介绍 1.1.<c:> 核心标签库  JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:1.表达式控制标签:out.set.remove.catch2 ...

  3. 设置TreeView背景色

    以下为在Csdn上找到的Treeview资源管理器代码,怎样改变其背景色?用:SendMessage SysTreeWindow,TVM_SETBKCOLOR,0,byval RGB(255,255, ...

  4. 解决org/sonarsource/scanner/maven/SonarQubeMojo : Unsupported major.minor version 52.0

    ide jdk 版本换成对应的 如:sonarqube-6.3  --> jdk1.8

  5. Centos下cacti的安装

    介绍 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形.它提供了非常强大的数据和 ...

  6. 工具-VIM配置

    设置缩进的空格数 shiftwidth=4 设置制表符宽度 tabstop=4 高亮显示当前行 cursorline 高亮显示当前列 cursorcolumn

  7. HDUOJ----Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. poj-------Common Subsequence(poj 1458)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 34477   Accepted: 13 ...

  9. SpringMVC中的Controller默认单例

    众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...

  10. Python实现 K_Means聚类算法

    使用 Python实现 K_Means聚类算法: 问题定义 聚类问题是数据挖掘的基本问题,它的本质是将n个数据对象划分为 k个聚类,以便使得所获得的聚类满足以下条件: 同一聚类中的数据对象相似度较高 ...