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

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

单独编译:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

头文件可包含的内容:

函数原型

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

结构声明

类声明

模板声明

内联函数

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

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

#ifndef   xxxx_xxx_H

#define  xxxx_xxx_H

...

#endif

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

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

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

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

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

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

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

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

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

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

C++Review4_代码的组织的更多相关文章

  1. 论vue项目api相关代码的组织方式

    论vue项目api相关代码的组织方式 看了下项目组同事的代码,发现不同项目有不同的组织版本 版本一: ├─apis │ a.api.js │ b.api.js │ b.api.js │ d.api.j ...

  2. Java编程的逻辑 (22) - 代码的组织机制

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  3. node.js整理 01代码的组织和部署

    模块 require(函数) 用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象. 模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头:注意单个模块名默 ...

  4. #001 如何组织JS代码

    如何组织JS代码 有没有这样的经历,在编写代码的时候,因为功能简单,写的时候比较随意,所有的JS代码都放在一个文件里面,但是随着功能的增加,发现代码很乱,不好维护. 简单的整理了一下,目前对已有项目的 ...

  5. .NET C#基础(6):命名空间 - 组织代码的利器

    0. 文章目的   面向C#新学者,介绍命名空间(namespace)的概念以及C#中的命名空间的相关内容 1. 阅读基础   理解C与C#语言的基础语法 2. 名称冲突与命名空间 2.1 一个生活例 ...

  6. 代码的坏味道(20)——过度耦合的消息链(Message Chains)

    坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...

  7. 代码的坏味道(16)——纯稚的数据类(Data Class)

    坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...

  8. 代码的坏味道(18)——依恋情结(Feature Envy)

    坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...

  9. 代码的坏味道(14)——重复代码(Duplicate Code)

    坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...

随机推荐

  1. ACM:树的变换,依据表达式建立表达式树

    题目:输入一个表达式.建立一个表达式树. 分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理!             在代码中.仅仅有当p==0的时候.才考虑这个运算符,由于括号中的运 ...

  2. mysql的执行计划概念说明

    explain中的列的说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的. id列越大执行优先级越高, ...

  3. BZOJ 1008 越狱题解

    其实这题很水,显然n个房间有m种宗教,总共有n^m种情况, 我们再考虑不合法的情况,显然第一个房间有m种情况,而后一种只有m-1种情况(因为不能相同) 所以不合法的情况有(m-1)^(n-1)*m种情 ...

  4. 【UTR #1】ydc的大树

    [UTR #1]ydc的大树 全网唯一一篇题解我看不懂 所以说一下我的O(nlogn)做法: 以1号点为根节点 一个黑点如果有多个相邻的节点出去都能找到最远的黑点,那么这个黑点就是无敌的 所以考虑每个 ...

  5. 自定义属性 —— data-*

    一.基本概念 在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,使用这样的结构可以进行数据存放.使用data-*可以解决自定义属性混乱无 ...

  6. HDU-1260_Tickets

    Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

  7. Git 进阶:10大技巧让你迅速提升

    1.Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情. 命令: cd ~ curl https://raw.github.com/git/git/ma ...

  8. @codechef - MXMN@ Maximum and Minimum

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义函数 f(G, x, y) 为 G 中点 x 和点 y 之间 ...

  9. 云数据库 MySQL 8.0 重磅发布,更适合企业使用场景的RDS数据库

    点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 云数据库MySQL 8.0 升级发布会 2019年5月29日15时,阿里云云数据 ...

  10. 因为 Java 和 Php 在获取客户端 cookie 方式不同引发的 bug

    遇到个 Java 和 Php 在获取客户端 cookie 方式不同导致跨系统的问题.所以写了这篇博客梳理下相关知识. 实验 下面通过两个简单的实验,来看Java和Php在获取web请求中的cookie ...