头文件的学习
头文件一般用来包含:
函数原型
使用#define或const定义的符号常量
结构声明
类声明
模板声明
内联函数
但是有一件事必需要清楚,就是上述的各种声明只能声明一次,声明多次编译器会报错.对于这个问题,现在有两种解决方法:
1.在头文件的开始处加上预编译指令:#pragma once.这个指令确保此头文件只能被#include一次.
2.使用宏技术:即:
#ifndef T_H
#define T_H
![](/Images/OutliningIndicators/None.gif)
//将所有声明写在这里
#endif
第1种方法不能确保在所有的编译器下通过,属于相对比较新的用法.第2种方法可以在所有的编译器下通过,其理论是通过定义了一个宏来使编译器只声明一次.
对于全局变量,通常是不能放在头文件中的,这样在多个cpp文件#include这个头文件后会引起重复声明错误(即使使用上面的第2种技巧在VS2005的编译器下也是如此,我有些迷惑),那么通常的方法是在某个cpp文件中声明全局变量,然后在头文件中用extern来声明变量,以通知编译器此变量属于其它cpp文件.但是,也可以通过宏这个技巧将全局变量的声明放到头文件中:
#ifdef _JB_ROOT
#define EXT
#else
#define EXT extern
#endif
![](/Images/OutliningIndicators/None.gif)
//下面声明变量
EXT int var;
当然,需要在某一个cpp文件中(只能是一次,一般是包含main函数的文件)#include这个头文件的前面,声明:#define _JB_ROOT,这样其实是只在第一次时真实的声明了全局变量,其它时候都是声明了extern.
函数原型
使用#define或const定义的符号常量
结构声明
类声明
模板声明
内联函数
但是有一件事必需要清楚,就是上述的各种声明只能声明一次,声明多次编译器会报错.对于这个问题,现在有两种解决方法:
1.在头文件的开始处加上预编译指令:#pragma once.这个指令确保此头文件只能被#include一次.
2.使用宏技术:即:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
第1种方法不能确保在所有的编译器下通过,属于相对比较新的用法.第2种方法可以在所有的编译器下通过,其理论是通过定义了一个宏来使编译器只声明一次.
对于全局变量,通常是不能放在头文件中的,这样在多个cpp文件#include这个头文件后会引起重复声明错误(即使使用上面的第2种技巧在VS2005的编译器下也是如此,我有些迷惑),那么通常的方法是在某个cpp文件中声明全局变量,然后在头文件中用extern来声明变量,以通知编译器此变量属于其它cpp文件.但是,也可以通过宏这个技巧将全局变量的声明放到头文件中:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。