更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C/C++开发过程中的头文件规整

  • 发布:C++培训
  • 来源:资料库
  • 时间:2017-10-17 17:19

对编程语言感兴趣的读者建议看一看Tiobe Index [1], 它经常会提醒你今年哪几个程序设计语言最流行。这种流行程度当然跟“钱”途有关。

针对苹果手机App编程的语言Objective C其实一直存在,但也是在iPhone风靡全球以后,它才从排行40几位火箭般蹿升到前十位,然后随着Apple公司推荐程序员使用Swift语言,它才逐渐让位给了Swift。

同理,当深度学习库和物联网成为最为关注的未来后,Python语言的地位也逐渐加强,进位到了第五名的位置。每个语言排名此起彼落,是很正常的,不是吗?

但是,不需要仔细琢磨你就会发现:前四个程序语言的地位在近几十年一直遥遥领先,居于统治地位。它们依次是Java, C, C++, C#. Java语言是写一次,就可以在各种平台上跑的那种万金油语言,C/C++是七八十年代以来随着Unix系统软件的广泛普及而长盛不衰,C#则是微软公司的利器,希望克服C/C++的缺点,让Java虚拟机让位于NET平台。

这么多年风风雨雨下来,连提出Java语言的SUN公司都已变成昨日黄花,Java语言的地位依旧稳固,因为它的生命力深深扎根于Oracle,IBM,Google等一系列公司,并得到他们的支持。如今的Android平台下缺省开发语言是Java,大胆预测即便新的Kotlin语言提出来替换它,也不能撼动其根深蒂固的地位。

说了这么多引言,其实我真正想说的是C/C++语言的一个小问题,却又是系统软件工程的一个大问题,估计跟这两个语言的统治地位一样会长期困扰大家。

C/C++的程序通常有两个部分,一个是.h头文件,是通常.c实现文件头上引入的外部引入(include)的程序接口。自从David Parnas提出信息掩蔽原则后【2】,写程序要注意把接口和实现分离开来。虽然这篇文章的历史很悠久,想研究软件工程的朋友还是一定要读一读。

这就带来了一个小问题:接口,或者我们说的应用程序接口API,往往声明了大于实现需要的内容。比如说,

#include <stdio.h>

int main(int argc, char ** argv) {

printf("Hello, world!\n");

}

以上程序是最小的例子了。可是,你要是把头文件stdio.h全部展开,会引入946行代码!946行代码都长什么样呢?大概是这个样子:

。。。

23 #ifndef _STDIO_H

24

25 #if !defined __need_FILE && !defined __need___FILE

26 # define _STDIO_H 1

27 # include <features.h>

28

29 __BEGIN_DECLS

30

31 # define __need_size_t

32 # define __need_NULL

33 # include <stddef.h>

34

35 # include <bits/types.h>

36 # define __need_FILE

37 # define __need___FILE

38 #endif /* Don't need FILE. */

。。。

比这还绝的是,引入的第27行又递归地引入更多的头文件,又是163行代码。。。如此一来一去(术语称为预处理),你会得到852行代码,让编译器去理解。

可是,从这个程序的意图上说,你只需要那么一行声明:

extern int printf (const char *__restrict __format, ...); 就能够编译通过了。

问题说清楚了,当你的程序引入头文件的时候,编译器不分青红皂白的处理全部信息,就会浪费宝贵的编译时间。如果有办法自动地规整程序,简化为只引入必要的信息,就能够有效地缩减编译器计算的时间。

Java和其他程序语言当然也有类似的问题,但是在C/C++程序中表现得尤其明显。因为系统软件,比如Linux Kernel, DB2,嵌入式系统,等等往往很复杂,需要定义许许多多头文件,把它们整理清楚是很有用的工具。细节我就不详细展开了,参见以下参考文献:

【1】 #/tiobe-index/

【2】DL Parnas. On the criteria to be used in decomposing systems into modules.Communications of the ACM 15 (12), 1053-1058

【3】Yijun Yu, Homayoun Dayani-Fard, John Mylopoulos: Removing false code dependencies to speedup software build processes. CASCON 2003: 343-352

【4】Homayoun Dayani-Fard, Yijun Yu, John Mylopoulos, Periklis Andritsos: Improving the Build Architecture of Legacy C/C++ Software Systems. FASE 2005: 96-110

【5】Yijun Yu, Homayoun Dayani-Fard, John Mylopoulos, Periklis Andritsos: Reducing Build Time through Precompilations for Evolving Large Software. ICSM 2005: 59-68

【6】Yijun Yu, Faster Compilation through Lighter Recompilation, The Open University, UK, Technical Report, 2012/07, 2012. pp. 1-5.

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++构造及析构函数执行顺序
下一篇:C语言编程之结构体内存对齐

超全的C语言标识符知识

C指针——指针类型转换

C指针——指针和结构类型的关系

C指针——数组和指针的关系

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省