当一个项目越来越大,代码该如何组织?C++组织程序的策略是什么?遇到类、变量、函数的重名问题该如何解决?

=====================================================

单独编译:

首先C/C++鼓励程序员把组件函数放在多个独立的文件中,这是因为编译器可以单独编译这些文件,然后将它们链接成可执行的程序。

这是因为如果你修改了一个文件,那么可以只重新编译该文件,然后将它与其他文件链接起来即可,这样使得大程序的管理更加便捷,高效。

因为编译是需要耗费时间的,源代码的频繁修改也是不可避免的。这就需要程序的组织策略很好地平衡这个问题。

一个程序的所有内容,可以分成不同的部分放在不同的源文件里,源文件的内容都是相对独立的,在编译时不需要与其他文件互通。

编译完成后与其他文件进行一次链接就可以了,编译后再链接,整个程序就可以运行了。

编译完未链接的文件叫做目标文件,有时候也可以叫做库文件

库文件其实是编译好的源文件的一种输出形式,这样可以方便地给别人提供现成的可运行的代码,使用者只需要链接一下就可以了。

当然库的提供者需要提供库所对应的头文件,头文件里包含了接口和声明。

使用者只需要知道接口和原型,而不用关心具体实现。

库的提供者可以很好地保护源代码不被看到。

两者之间就实现解耦了。这样更加方便协同合作开发一个大项目。

=====================================================

接下来讲讲为什么要有头文件?

首先我们知道函数和变量在使用前都需要声明

那么声明的目的是为了告知编译器这个符号(变量、函数)的存在,然后编译器去寻找这个符号的定义。

使用和定义肯定是不在一处的,这是因为前面说到单独编译的原因。

所以要解决的问题就是在使用这个符号时,让编译器知道去哪里找定义。

那么使用前声明就很有必要了。

当然声明可以很多次,而定义只能有一次,因为出现了两种不同的定义的话,编译器就不知道去用哪个了。

所以程序员编写程序的时候,都需要些很多声明。

每次编写一个源文件都需要把这么多声明拷贝进源代码中,这样做显得很笨拙。

也是有一种策略就诞生了:头文件。

头文件里包含了你要用到的各种声明,在其他各个源文件中,你只需要使用 # include "头文件" 预编译命令,就可以把这些声明的原型包含进源文件中。这样就很方便了。

这是一个非常有用的组织程序的策略,

但是要注意头文件也不是什么都能包含的,

尽量不要把函数定义或变量声明包含进去,因为可能出现,别人包含了该头文件,然后同一个程序将包含同一个函数的两个定义。目的还是为了防止重复定义

也不能把变量声明包含进头文件,因为变量声明会创建变量。也会产生同名变量的冲突。

头文件可包含的内容:

函数原型

使用#define或const定义的符号常量

结构声明

类声明

模板声明

内联函数

上述几个声明没有创建变量,只是告知编译器如何创建变量而已。

另外头文件一般在开头使用一种固定的预处理语句:

#ifndef   xxxx_xxx_H

#define  xxxx_xxx_H

...

#endif

这是为了防止头文件的重复包含所引起的重复声明。

因为头文件中一般也会使用#include包含其他头文件。(这是一种嵌套的关系)

这是一种头文件的管理策略。

====================================================

项目的程序量变大,不可避免地会遇到重名问题

名称:可以是变量、函数、结构、枚举、类、类和结构的成员等。

为了解决重名问题,C++标准提供了名称空间工具。

这就好像北京和上海都有人民广场这个名称,如果只知道人民广场的话,实际上重名冲突,并不知道是具体哪个人民广场。

如果加上名称空间的话,北京的人民广场,上海的人民广场。这样我们用人民广场这个词的时候,是知道这个词在哪个空间中使用,也就不会出现名称冲突。

C++有一套语法规则来实现这个名称空间机制。编译器也支持名称空间机制。

最新文章

  1. 阮一峰对js的见解(10大缺陷)
  2. C语言运算符优先级 详细列表
  3. Guava中Predicate的常见用法
  4. 【poj2478】 Farey Sequence
  5. 作业七:团队项目——Alpha版本冲刺阶段 001
  6. codeigniter load_class
  7. 测算Redis处理实际生产请求的QPS/TPS
  8. WCF学习心得----(五)生成客户端
  9. Hadoop应用开发实战案例 第1周
  10. iPhone 5s网络钓鱼邮件,和苹果发布会同步亮相
  11. Java-Swing编程之对话框案例详解
  12. 《Head First Java》读书笔记(3) - 异常和IO
  13. lvs与haproxy
  14. Hbase思维导图之调优
  15. 使用 MtVerify.h头文件 ,用的时候把他头文件的内容添加到项目
  16. Oracle 与Sql Server常用函数对比
  17. 自适应XAML布局经验总结 (一)原则和页面结构设计
  18. 第二次作业利用java语言编写计算器进行四则运算
  19. 20145238-荆玉茗 《网络对抗技术》-Web安全基础实践
  20. PHP投票实现24小时间隔投票

热门文章

  1. spring调试
  2. C++笔记:面向对象编程(Handle类)
  3. Android Studio(十一):代码混淆及打包apk
  4. web项目的文件上传和 下载
  5. python项目管理
  6. hdu 1599 find the mincost route(无向图的最小环)
  7. WebService 基础知识点和用Postman调试
  8. Python--day61--安装Django,Django项目的启动和设置运行端口和关闭运行端口
  9. Python3 dir() 函数
  10. H3C RIPv2配置任务