博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 多文件编译简述:头文件、链接性、声明与定义
阅读量:6600 次
发布时间:2019-06-24

本文共 1349 字,大约阅读时间需要 4 分钟。

目录

Commen Sense

C++ 在编译时对每个翻译单元(Translation Unit,通常是文件,下文以文件代称)单独编译。

注意区分 声明(Declaration)定义(Definition)

声明规定了变量的类型和名字;

定义则负责创建与名字关联的实体,定义还申请存储空间。[1]

C++ 的“单定义规则”指出变量只能有一次定义。

注意区分 作用域(Scope)链接性(Linkage)

作用域描述名称在文件的多大范围可见;

链接性描述名称如何在不同单元间共享。

头文件

头文件中常包含的内容

  • 函数原型
  • 使用 #defineconst 定义的符号常量
  • 结构声明
  • 类声明
  • 模板声明
  • 内联函数

普通函数的定义不能放在头文件中,即使使用了 #ifndef 等预处理指令防止头文件被重复包含。这是因为每个源文件被单独编译,头文件中的函数定义会使链接后的程序包含多个重复定义,预处理指令只能保证单个文件被单独编译时不会出现头文件的重复展开。

内联函数需要在每一个调用点都对编译器可见,因此通常直接放在头文件中被所有实现文件 include。

模板函数和模板类的定义不会产生任何“实体”函数,因此可以出现在头文件中。又由于与内联函数类似的原因,其通常都被放在头文件中。

类的声明和实现通常分处于一个头文件(.h)和实现文件(.cpp)中,由于模板类的特性,可将声明与实现合并到一个文件(.hpp)简化源文件结构。但非模板类的实现显然不能位于头文件中。

链接性

以下关键字都可能有多义,这里仅讨论与链接性有关的功能。本节涉及的变量皆指 C++ 内存模型中的静态持续变量。

链接性分为三种:外部链接性、内部链接性、无链接性,含义见下文。

static 与链接性控制

在代码块的外部使用 static 声明变量和函数使其具有内部链接性,在当前文件外不可见。

在代码块的内部使用 static 声明变量和函数使其无链接性,只能在当前函数或代码块中访问。

在代码块的外部不使用 static 声明变量和函数使其具有外部链接性,可在其他文件中访问。

extern 与外部链接性

extern 用于声明一个变量(而非定义它)。因此,在头文件中包含变量的声明可以使得其在所有包含该头文件的源文件中都可见,即实现一种“全局变量”的效果。但须保证有且仅有一次变量的定义。

例如,在头文件 header.h 中加入声明语句 extern int ver;,并在源文件 a.cpp 中加入定义 int ver; ,则所有包含 header.h 的源文件都可以直接使用变量 ver。而若 a.cpp 中的定义语句为 static int ver; ,则变量 ver 失去外部链接性,若有其他源文件引用它,即使包含了 header.h 也会导致链接出错。

但形似 extern int x = 1; 的语句声明并定义变量。

Reference

[0] 本文中的引文内容如无特殊标注皆引自《C++ Primer Plus

[1] , Broglie @ cnblogs

转载于:https://www.cnblogs.com/glowming/p/cpp_multifile_compile.html

你可能感兴趣的文章
org.apache.jasper.JasperException: Unable to compile class for JSP:
查看>>
OSGi与Java EE
查看>>
cocos2d-x加box2d制作弹弓类游戏 第二部分
查看>>
【sed】个人用到的方法记录
查看>>
screen工具(虚拟终端)、nohup命令(让脚本后台运行)
查看>>
centos 卸载python2之后的解决办法
查看>>
hdu1711(kmp纯模板)
查看>>
MySQL-Utilities
查看>>
redis教程(四)之redis启动服务与连接
查看>>
STP,RSTP,MSTP和链路聚合
查看>>
SameText
查看>>
Oracle中adump、bdump、dpdump、udump目录中一些内容的使用
查看>>
【python项目实战】BBS论坛(4)尝试页面美化
查看>>
再学 GDI+[32]: TGPPen - 拐角长度的限制 - SetMiterLimit
查看>>
/boot分区空间不足,清理老内核所占空间
查看>>
怎么样新建RobotFramework 的测试用例
查看>>
软件吞噬世界
查看>>
Apache模块之mod_bandwidth带宽限制
查看>>
twemproxy安装配置(memcahe代理)
查看>>
MySQL主从同步配置实现数据库备份
查看>>