头文件管理
最近在编写头文件时碰到了一些大多数初学者碰到的一些问题,下面对于在编写头文件时需要注意的一些问题进行一个小的总结。
1. 在编译自己的头文件的时候,注意包含头文件的尖括号和双引号的使用。可能很多初学者习惯于编写自己的头文件时比较习惯于使用尖括号来包含自己的头文件,但往往会出现“无法打开xx.h文件”,可能会有人奇怪,自己编写的头文件明明包含在工程的目录下,问什么会显示这类错误呢?以下是《C++primer plus(第六版)》给出的解释:
“如果文件名包含在尖括号里面时,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;但是如果文件包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或者是其他目录,取决于编译器)。如果没有在哪里找到头文件,则将在标准位置查找。因此在包含自己的头文件时,应使用引号而不是尖括号;”
2.头文件包含问题。在同一个文件中只能将同一个头文件包含一次。但是很可能在不知情的情况下将头文件包含多次。例如,可能使用包含另一个头文件的头文件。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理编译指令#ifndef(即if not defined)的。下面的代码意味着仅当以前没有使用预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句:
#ifndef COORDIN_H_
…
#endif
通常在生成自己的头文件时是这样使用的
#ifndef COORDIN_H_
#define COORDIN_H_
//place include file contents here
#endif
采用这种方式编写头文件的目的在于可以避免在一个文件中定义同一个结构多次,而导致编译错误。
下面给一个相关的小例子吧,这样理解起来更容易一点。程序的功能是用来将直角坐标系坐标值转换为极坐标系坐标值。
1.头文件coordin.h
#ifndef COORDIN_H_
#define COORDIN_H_
struct polar
{
double distance;
double angle;
};
struct rect
{
double x;
double y;
};
polar rect_to_polar(rect);
void show_polar(polar);
#endif
2.源代码文件
coordin.cpp
#include "coordin.h"
#include<cmath>
#include <iostream>
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 rplace)
{
using namespace std;
const double Rad_to_deg = 57.3;
cout << "distance=" << rplace.distance;
cout << ",angle=" << rplace.angle*Rad_to_deg;
cout << " degree\n";
}
main.cpp
#include "coordin.h"
#include<iostream>
int main()
{
using namespace std;
rect rplace;
polar pplace;
cout << "enter two number x and y:";
while (cin>>rplace.x>>rplace.y)
{
pplace = rect_to_polar(rplace);
show_polar(pplace);
cout << "next two number (q to exit):";
}
cout << "bye!\n";
return 0;
}