前言
尽管可以在函数体内定义类,但是这样的类毕竟受到类一些限制。所以,类一般都不定义在函数体内。当在函数体外部定义类时,在各个指定的源文件中可能只有一处该类的定义。而且,如果要在不同的文件使用同一个类,类的定义就必须保持一致。
一、头文件
1.头文件作用
1.为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在的头文件名字应与类的名字一样。比如,string类就在名为string的头文件中定义。
2.头文件提高代码的可阅读性,比如我们需要找到这个库的接口函数,我们只需要查看头文件即可,然后跳转到对应函数定义实现文件。
2.头文件通常包含什么
头文件通常包含那些只能被定义一次的实体,如类,const和constexpr变量等。头文件也经常用到其他头文件的功能。
ps:头文件一旦改变,相关的源文件必须重新编译以获取更新过的声明。
二、预处理器概述
1.什么是预处理器
确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor)。
2.预处理器作用
预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序。之前已经用到类一项预处理功能#include,当预处理器看到#include标记时就会用指定的头文件的内容代替#include。
3.头文件保护符
C++程序还会用到一项预处理功能是头文件保护符,头文件保护符依赖于预处理变量。
预处理变量有两种状态:已定义和未定义。
#define指令把一个名字设为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作直至遇到#endif指令为止。
#ifndef SALES_DATA_H //检查预处理变量是否定义
#define SALES_DATA_H //把SALES_DATA_H定义为预处理变量
#include<string>
struct data{
/***/
};
#endif //如果检查预处理变量为真,则执行结构体内部分
ps:预处理变量无视C++语言中关于作用域的规则。
整个程序中的预处理变量包括头文件保护符必须唯一,通常的做法是基于头文件中类的名字来构建保护符的名字,以确保其唯一性。为了避免与程序中的其他实体发生名字冲突,一般把预处理变量的名字全部大写。