转载:原文链接
作为一个小白,我对于自己是无语的!菜的一批,写C++应该也有两年了,但是还不知道如何将一个单文件的长、臭项目重构为短、清晰的多文件项目。单文件项目里面十几个函数,看得我整个人都快崩溃了。
一、基本结构
从简单的多文件项目开始吧!通常分为三部分:main.cpp
,aclass.cpp
,aclass.h
三个部分:
-
aclass.h
:- 函数原型
- 使用#define或const定义的符号常量
- 结构体声明
- 类声明
- 模板声明
- 内联函数
-
aclass.cpp
:包含与结构体、模板、类相关的函数代码 -
main.cpp
:包含调用与结构体、模板、类相关的函数代码
二、“”
和<>
的区别
- 包含自定义的头文件时,用双引号
“”
,编译器首先查找当前工作目录或源代码目录;如果没有找到,则将在标准位置查找。 - 包含库的头文件时,用尖括号
<>
,编译器将查找存储标准头文件的主机系统的文件系统中查找。
三、头文件使用ifndef
、define
、endif
的解释
由于在不知情的原因下,有可能将头文件包含多次,基于预处理器编译指令#ifndef
(即if not define
)可以避免这种情况 。
#ifndef ACLASS_H_
...
#endif
上面这段代码意味着仅当之前没有使用预处理器编译指令#define
定义名称ACLASS_H_
时,才处理#ifndef
和#endif
之间的语句。
编译器首次遇到该文件时,名称ACLASS_H_
没有定义(该名称根据头文件的名字取得,并加上一些下划线,使其在其他地方不太可能被定义),在这种情况下,编译器将查看#ifndef
和#endif
之间的内容;如果在同一个文件中遇到其他包含aclass.h
的内容,编译器就知道ACLASS_H_
已经被定义了,从而跳到#endif
后面的一行上。
四、多文件案例实战
Project
--- Sources
------ coordin.cpp
------ main.cpp
--- Headers
------ coordin.h
main.cpp
内容如下
#include <iostream>
#include "coordin.h"
using namespace std;
int main()
{
rect rplace; //直角坐标
polar pplace; //极坐标
cout << "Please Enter the x and y values: " << endl;
while(cin >> rplace.x >> rplace.y) //输入直角坐标
{
pplace = rect_to_polar(rplace); //将直角坐标转化为极坐标
show_polar(pplace);
cout << "Next two numbers (q to quit): " << endl;
}
cout << "Bye." << endl;
return 0;
}
coordin.cpp
内容如下:
#include <iostream>
#include <cmath>
#include "coordin.h"
using namespace std;
polar rect_to_polar(rect xypos)
{
polar answer;
answer.distance = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);
answer.angle = atan2(xypos.y, xypos.x);
return answer;
}
void show_polar(polar dapos)
{
const double Rad_to_deg = 57.29577951;
cout << "distance = " << dapos.distance;
cout << ", angle = " << dapos.angle * Rad_to_deg;
cout << " degrees\n";
}
coordin.h
内容如下:
#ifndef COORDIN_H_INCLUDED
#define COORDIN_H_INCLUDED
struct polar
{
double distance;
double angle;
};
struct rect
{
double x;
double y;
};
polar rect_to_polar(rect xypos);
void show_polar(polar dapos);
#endif // COORDIN_H_INCLUDED
coordin.h
中的声明和coordin.cpp
函数实现会自动进行对应的链接,这是C++自身的属性功能,.h
文件中函数声明,会自动触发编译器进行同名.cpp
中对应函数实现的检索,如果没检索,则会报错提示没有具体实现。
网友评论