今天向大家介绍c++20核心语法modules,从c++11到今天的c++20,这是c++不断推陈出新从量变到质变的过程。在介绍modules之前,我们先来了解include机制。
include机制
c++为了完全兼容c语言,让c语言开发者快速学习c++语言,因此继承了c语言的include机制。include是包含的意思,就是将头文件的所有内容复制过来,#则代表预处理的意思,相关的预处理还有#ifdef、#endif,在此就不做过多的介绍。
c++将代码分为头文件和cpp源文件,头文件主要是申明函数等相关接口,cpp文件则是具体实现。开发者可以将cpp文件编译成lib文件,使用者无需关系其具体的实现,这样能很好的将实现逻辑和接口分离。
编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元。
在同一个编译单元里,重复包含头文件会照成重复定义的问题,例如:一个头文件定义了一个class(不是申明),然后在一个cpp文件中包含两次,编译器就会报“类型重定义”错误。为了解决这一编译错误问题,必须要在头文件里写上#ifndef、#define和#endif(新版编译器你可以#pragmaonce),但大多数人认为这一解决办法并不完美。同时还需要保证include的顺序问题,多个头文件中的宏定义顺序关联问题,必须要按照顺序包含头文件。
c++编译慢是公认的,你会发现编译一个工程的时间足够干很多事情,其中有一大部分原因就是include照成的。一个公共的头文件很可能被N个编译单元包含,这N个编译单元都会去编译头文件,尤其是修改这个公共头文件,再编译简直让人欲哭无泪,准确的诠释了“牵一发而动全身”。
C++不适应在大规模程序设计与现代开发中的应用环境,越来越多的模板的使用,已经导致了编译时可伸缩性和程序员生产力的严重障碍。它构建性能低下,与云和分布式构建的集成性差。此外,严重依赖头文件包含(即从编译器的角度复制代码)和宏扼杀了C++开发人员的开发。
在c++中每个cpp都单独编译,最后将他们链接在一起,由于每个编译单元都是独立编译的,导致各个编译单元无法沟通,采用头文件建立各个编译单元的桥梁,头文件中描述接口的信息。那么有没有一种替代头文件的方式?将申明和实现放在一个文件中,接口信息交给编译器自动生成?答案是肯定的,请读者继续往下看。
可以看出include的机制有一系列问题,这些问题总是不尽人意,曾经有多少人抱怨include机制太烂,又有多少人为此转移阵营而投靠其它语言。面对标准委员会的一次又一次推移,最终module特性冻结在c++20。
modules重磅来袭
为了解决以上系列问题,c++20modules应运而生!(手动特效:金光闪闪)
其中,WG21官方的n.pdf文档对modules的目标描述:
1.