大家好,我是梁唐。
这是EasyC++系列的第43篇,来聊聊头文件的编写。
想要追求更好阅读体验的同学,可以访问github仓库:EasyLeetCode。
编写头文件
我们之前做的左右示例都是在一个单独的cpp文件当中完成的,当我们要做一个相对复杂或大型的项目时,我们显然不能把所有代码都写在一个cpp里。这就需要我们拆分代码,但代码按照逻辑划分,写入不同的cpp文件当中。
在我们编译的时候,我们可以将这些cpp文件分别单独编译,最后再连接到一起。这样做的好处是,当我们只修改了某一个文件的时候,可以只单独编译那一个文件,不会影响其他文件的编译结果。一般来说大型项目,都会使用一下自动化的编译工具,比如make等,不会手动执行编译过程,但对于这其中的一些细节,还是需要有所了解。
我们来看C++ primer当中提供的一个例子。
现在我们要实现一个将直接坐标转化成极坐标的功能,我们需要定义两个结构体分别表示直角坐标和极坐标,另外还需要实现从直接坐标到极坐标的转化。
显然相对于主体程序而言,这部分代码是独立的,所以我们可以把它们放入一个单独的cpp文件当中。首先要明确的是,main()函数和其他函数都用到了同一个结构体,因此两个cpp文件都需要包含该结构体的声明。显然拷贝代码是很糟糕的选择,比较好的做法是将结构体的声明写在头文件当中,通过#include语句引入。
这样的话整体的代码就分成三个部分:
头文件:包含结构体声明、函数声明coordin.cpp:包含坐标系转化相关的代码main.cpp:主体程序
在之后面向对象的章节当中, 我们将会经常用到这样的代码结构。
对于头文件当中的内容有严格的限制,由于头文件可能会被多个cpp文件引入,所以我们不能将函数的实现或参数的定义放入头文件当中。因为同一个程序中包含同一个函数的多个定义会引发报错,参数同理。
只有以下内容可以写入头文件当中:
函数原型(函数声明)#define或const定义的符号常量结构体声明类声明模板声明内联函数(inline)
在同一个文件当中只能引入一个头文件一次,但有的时候由于引用依赖的原因,可能会导致重复引入。比如引入A和B头文件,B头文件中引入了A,导致A被引入两次。
为了解决这个问题,我们可以加入预编译指令#ifndef,含义是if not defined,判断某定义是否存在。只有当定义不存在时才会直接#ifndef和#endif之间的语句:
#ifndef COORDIN_H_// statements#endif
一般情况下我们使用#define创建符号常量:
#define MAXI 4096
但由于这里我们只是用来区分是否引入,所以只需要名称即可:
#ifndef COORDIN_H#define COORDIN_H// todo#endif
这样,当引入一次之后,COORDIN_H即被定义,那么下次就不会再执行这段代码。最后,我们写出完整的头文件代码:
#ifndef COORDIN_H__#define COORDIN_H__struct polar { double distance, angle;};struct rect { double x, y;};polar rect_to_polar(rect xpros);void show_polar(polar dapos);#endif
标签: 文件
②文章观点仅代表原作者本人不代表本站立场,并不完全代表本站赞同其观点和对其真实性负责。
③文章版权归原作者所有,部分转载文章仅为传播更多信息、受益服务用户之目的,如信息标记有误,请联系站长修正。
④本站一律禁止以任何方式发布或转载任何违法违规的相关信息,如发现本站上有涉嫌侵权/违规及任何不妥的内容,请第一时间反馈。发送邮件到 88667178@qq.com,经核实立即修正或删除。