C语言编程入门之程序头文件的简要解析

 更新时间:2015年12月02日 16:52:29   作者:fushiqianxun  
这篇文章主要介绍了C语言编程入门之程序头文件的简要解析,包括头文件重复包含问题等方面的说明,需要的朋友可以参考下

头文件是扩展名为.h的文件,其中包含C函数的声明和宏定义,也可以多个源文件之间共享。有两种类型的头文件:程序员编写的文件,和编译器中附带的文件。

要求使用头文件的程序,包括通过它,使用C语言预处理指令#include就像所看到的包含stdio.h头文件,它随着编译器自带。

包括一个头文件等于复制头文件的内容,但我们不这样做,因为这很容易出错,一个好主意是我们不复制头文件的内容,特别是包括多个程序的源文件。

在C或C++程序的简单做法是,我们把所有的常量,宏全系统全局变量和函数原型在头文件,其中包括只要它要求包含头文件。

包括/函语法
用户和系统头文件使用预处理指令#include包括在内。它有以下两种形式:

#include <file>

这种形式被用于系统头文件。它会搜索系统目录的标准列表中指定的文件的文件。可以在前面加上目录到这个列表-I选项在编译源代码。

#include "file"

这种形式是用于自己的程序的头文件。它会搜索包含当前文件的目录中的文件命名的文件。可以在前面加上目录到这个列表-I选项在编译源代码。

包括/函操作
#include指令的工作原理是指导C预处理器使用当前的源文件的其余部分,然后再继续扫描指定的文件作为输入。从预处理器的输出包含后跟来自于#include指令后的文本的输出已生成输出,随后从所包含的文件所得的输出。例如,如果有一个头文件 header.h 如下:

char *test (void);

主程序调用使用头文件,类似 program.c 这样:

int x;
#include "header.h"

int main (void)
{
  puts (test ());
}

编译器会看到同样数据流,因为它会如果program.c读取

int x;
char *test (void);

int main (void)
{
  puts (test ());
}

一次性头文件
如果头文件恰好被包含两次,编译器将处理它的内容两次,将导致一个错误。使用标准方法以防止包围文件的全部内容在一个条件,是这样的:

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

此构建体通常被称为包装#ifndef。当该头被再次包含,条件将是假的,因为HEADER_FILE定义。预处理器将跳过该文件的全部内容,而编译器不会看到它的两次。

计算包函
有时,有必要选择的几个不同的一个头文件被包含到程序中。它们可能会指定的配置参数被用于对不同类型的操作系统,例如。可以用一系列条件句做到这一点,如下所示:

 #if SYSTEM_1
  # include "system_1.h"
#elif SYSTEM_2
  # include "system_2.h"
#elif SYSTEM_3
  ...
#endif

但是,随着它的内容增长就会变得单调乏味,代替预处理器提供了使用宏的头文件名。这就是所谓的计算包括。而不是写一个头文件名#include直接参数,只需把宏的名字代替:

 #define SYSTEM_H "system_1.h"
 ...
 #include SYSTEM_H

SYSTEM_H将被扩展,而预处理器将寻找system_1.h仿佛的#include已经写了原来的方式。 SYSTEM_H可以通过Makefile -D选项定义。


关于头文件重复包含
1、如果头文件A包含头文件C,同时头文件B也包含头文件C,而写的程序中包含了头文件A,头文件B,然后在编译的时候就会出现头文件C重复包含的错误
这个错误 只要在自己写的头文件中这样写

#ifndef X  //X为你的标识符,保持唯一,可以长点,比如 #ifndef _INCLUDE_XXXXXX_H_
#define X

//这里是你的头文件

#endif

上面的X可以随便取名(可以用来“装”头文件,所以X一般取名为大写的头文件的名字,只不过把"."换成“_”),只要保证#ifndef和#define后面是同一个X就可以了,只是一个标识而已。翻译成中文就是,如果已经#define X了,后面的就不执行了。这样在同一个c文件中,保证可以只#include一个头文件,避免“在同一个c文件中对一个头文件include两次”的错误(第一次包含了该头文件后,就已经#define 了一次X,第二次包含时会遇到“#ifndef X”的判断,既然已经定义,只好对这个判断说yes了,后面的不再执行,
头文件就不会再加进去)。

2、写的代码里, 头文件A需要包含头文件B,头文件B需要包含头文件C,这种情况#include A就没有问题,不会出现重复包含的错误

注意:这里的#ifndef预处理是要解决在同一个c文件中包含了两次同一个头文件的错误,而在不同的c文件中是可以包含同一个头文件的。

如果不用#ifndef来对头文件做标记,又想“一劳永逸”地解决问题,不需要担心重复包含,则就要形成自觉,不要在头文件里定义变量或函数,只声明,这样多次include这个头文件时包含的都是声明,就没有问题,因此c语言里是允许多次声明同一个函数或变量的。

相关文章

  • 浅谈C++中virtual的三种用法

    浅谈C++中virtual的三种用法

    这篇文章主要介绍了浅谈C++中virtual的三种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C++ LeetCode1781题解所有子字符串美丽值之和

    C++ LeetCode1781题解所有子字符串美丽值之和

    这篇文章主要为大家介绍了C++ LeetCode1781题解所有子字符串美丽值之和,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Visual Studio2022+QT6创建桌面应用实现

    Visual Studio2022+QT6创建桌面应用实现

    本文主要介绍了Visual Studio2022+QT6创建桌面应用实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • c语言全盘搜索指定文件的实例代码

    c语言全盘搜索指定文件的实例代码

    c语言全盘搜索指定文件的实例代码,需要的朋友可以参考一下
    2013-03-03
  • OpenCV图像算法实现图像切分图像合并示例

    OpenCV图像算法实现图像切分图像合并示例

    这篇文章主要为大家介绍了python图像算法OpenCV实现图像切分图像合并操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • VSCode远程开发调试服务器c/c++代码

    VSCode远程开发调试服务器c/c++代码

    语音相关的好多项目要在linux上跑,但代码开发大多是在PC机上,本篇简单介绍一下怎么在个人电脑上用VSCode远程开发调试服务器上的c/c++代码。感兴趣的朋友跟随小编一起看看吧
    2020-04-04
  • C++ namespace相关语法实例分析

    C++ namespace相关语法实例分析

    这篇文章主要介绍了C++ namespace相关语法实例分析,对C++初学者有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • vs code 配置c/c++环境的详细教程(推荐)

    vs code 配置c/c++环境的详细教程(推荐)

    这篇文章主要介绍了vs code 配置c/c++环境的详细教程(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C语言实现统计字符串单词数

    C语言实现统计字符串单词数

    这篇文章主要介绍了C语言实现统计字符串单词数,代码非常的简洁,有需要的小伙伴快来参考下。
    2015-03-03
  • c语言实现计算圆周率的近似值

    c语言实现计算圆周率的近似值

    这篇文章主要介绍了c语言实现计算圆周率的近似值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论