您的位置:首页 > 编程语言 > C语言/C++

C++基本概念——关于头文件的那些事

2016-02-05 16:59 246 查看

1.什么是C/C++中的头文件?

在C/C++语言中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation).c或者.cpp就是你写的程序文件。

一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。

2.头文件的组成

头文件的组成通常是什么样子的呢?我们通过一个例子就一目了然了。C++/C程序的头文件以“.h”为后缀。以下是假设名称为graphics.h的头文件:

#ifndef GRAPHICS_H//作用:防止graphics.h被重复引用
#define GRAPHICS_H;
#include<....>//引用标准库的头文件
...
#include"..."//引用非标准库的头文件
...
void Function1(...);//全局函数声明
...
inline();//inline函数的定义
...
classBox//作用:类结构声明
{
...
};
#endif


从以上例子可以看出,头文件一般由四部分内容组成:

头文件开头处的版权和版本声明;

预处理块;

inline函数和constexpr的定义;

函数和类结构声明等。

在头文件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。

补充:C++中的预处理部分的知识

预处理的主要任务是确保程序多次包含之后仍然能够安全工作,例如当预处理看到#include的内容的时候,就用指定头文件的内容代替#include的内容。

C++中还会用到的预处理的功能是头文件保护符,头文件保护符依赖于预处理变量。预处理变量有两种状态已定义和未定义。例如前面的例子中,预处理指令#defineGRAPHICS_H设定为预处理变量,预处理指令#ifdef当且仅当变量定义时为真,预处理指令#ifndef,当且仅当变量未定义时为真。一旦检查结果为真,则继续后面的指令到#ednif结束。

我们通过前面的例子来理解一下,预处理这个概念的含义:第一次遇到graphics.h这个头文件的时候,#ifndef检查为真,预处理器将顺序执行后面的操作直到#endif为止。此时,预处理变量GRAPHICS_H变为已定义,对应的头文件的内容也会拷贝到程序中来,这样当后面再次遇到graphics.h头文件的时候,编译器将会忽略#ifndef#endif之间的部分。

注意,整个程序中的预处理变量必须唯一,通常的做法是基于头文件中的名字来构建保护符的名字,来确保其唯一性,同时为了避免与程序中变量名冲突预处理变量通常使用大写的形式。

3.什么样的内容适合放在头文件中?

对于具有外部存储类型的标识符,可以在其他任何一个源程序文件中经声明后引用,因此用户完全可以将一些具有外部存储类型的标识符的声明放在一个头文件中。具体地说,头文件中可以包括:用户构造的数据类型(如枚举类型),外部变量,外部函数、constexpr和inline函数等具有一定通用性或常用的量。而一般性的变量和函数定义不宜放在头文件中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: