0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中程序员编写的头文件和编译器自带的头文件

电子工程师 来源:未知 作者:李倩 2018-11-12 14:55 次阅读

头文件是扩展名为.h的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。

在程序中要使用头文件,需要使用 C 预处理指令#include来引用它。前面我们已经看过stdio.h头文件,它是编译器自带的头文件。

引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。

A simple practice in C 或 C++ 程序中,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。

引用头文件的语法

使用预处理指令#include可以引用用户和系统头文件。它的形式有以下两种:

#include

这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。在编译源代码时,您可以通过 -I 选项把目录前置在该列表前。

#include"file"

这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。在编译源代码时,您可以通过 -I 选项把目录前置在该列表前。

引用头文件的操作

#include指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及#include指令之后的文本输出。例如,如果您有一个头文件 header.h,如下:

char*test (void);

和一个使用了头文件的主程序program.c,如下:

int x;#include"header.h"int main (void){ puts (test ());}

编译器会看到如下的代码信息

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 可通过 -D 选项被您的 Makefile 定义。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18258

    浏览量

    222079
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128368
  • 编译器
    +关注

    关注

    1

    文章

    1575

    浏览量

    48606

原文标题:C语言中的头文件

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言必备知识头文件包含

    头文件在C语言中是非常重要的组成部分。
    的头像 发表于 12-01 18:20 779次阅读

    如何编写自己的C语言头文件

    编译器头文件所在目录。而使用尖括号(<>)时,刚好是相反的搜索顺序。假设我们有两个文件名一样的头文件hardware.h,但内容却是不一样的。一个保存在
    发表于 03-11 22:19

    C 18编译器头文件问题

    当我试图在C 18编译器中包含头文件时。它在头文件末尾引发语法错误。
    发表于 04-10 09:19

    那么头文件c文件的区别在哪里呢?

    众所周知,嵌入式开发中常用到的就是C语言,首先要做的都是先建立一个工程,在工程下,添加程序员写好的c文件(.
    发表于 11-08 07:05

    STC单片机在KEIL编译器中的头文件

    STC单片机在keil编译器里找不到头文件如何处理。首先在网络上找到一个关于STC单片机的升级包。安装上去以后,就可以看到有STC型号的单片机可以选择了。但是此时,它的头文件却无法
    发表于 08-26 10:52 8042次阅读

    怎么在keil里建立头文件

    keil中进行51单片机编写程序时,进行多文件编译处理,相关头文件的知识
    发表于 12-10 15:57 5次下载

    如何在C++代码中使用C头文件

    。 12.3.1 在C++中使用系统C头文件 要包括标准的系统 C 头文件,如 stdio.h,不必进行任何特殊操作。只有使用extern C 命令,由编译器自动包含标准 C 头文件
    发表于 10-19 09:24 3次下载

    C语言头文件是做什么的

    c语言程序代码文件扩展名只能是.c或者.h,换句话说,c语言程序代码只能在扩展名为.c或者.h的文件
    的头像 发表于 02-13 15:29 9010次阅读

    C语言头文件组织作用与包含原则详解

    说明 本文假定读者已具备基本的C编译知识。 如非特殊说明,文中源文件指 * .c文件头文件指 *.h文件,引用指包含
    的头像 发表于 11-12 17:49 2485次阅读

    C语言头文件组织与包含原则

    说明本文假定读者已具备基本的C编译知识。 如非特殊说明,文中“源文件”指 * .c文件,“头文件”指 *.h文件,“引用”指包含
    的头像 发表于 11-14 11:31 3198次阅读

    C语言中头文件包含里的那些事

    很多事不深入以为自己懂了,但真正用到项目上,才发现了问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。(毕竟刚毕业时老大对我最初的训练
    的头像 发表于 03-25 13:57 2166次阅读
    C<b class='flag-5'>语言中头文件</b>包含里的那些事

    MCU_头文件编写

    头文件中一般放一些重复使用的代码,如:常量、变量、宏等的定义,函数的声明。当使用#include语句引用头头文件时,相当于将头文件中的内容复制到#include处。头文件一般形式:#i
    发表于 12-05 10:36 5次下载
    MCU_<b class='flag-5'>头文件</b><b class='flag-5'>编写</b>

    C语言头文件路径的剖析

    编译器编译过程中会按照这些路径信息到指定的位置去查找头文件,然后通过预处理器作展开处理。在查找头文件的过程中,编译器会按照默认的搜索顺序到
    的头像 发表于 02-17 09:44 1059次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>头文件</b>路径的剖析

    【笔记】单片机头文件的顺序会让程序报错?

    单片机程序中的头文件程序的影响非常重要。头文件包含了函数、宏、结构体和其他声明的定义,它们提供了程序所需的各种功能和库。
    的头像 发表于 05-19 09:50 905次阅读
    【笔记】单片机<b class='flag-5'>头文件</b>的顺序会让<b class='flag-5'>程序</b>报错?

    什么是头文件头文件编写的一般格式要求是怎样?

    本文介绍头文件的定义、编写、保存及引用等方面的内容,包括了一般的格式要求、例程等。
    的头像 发表于 11-08 16:25 906次阅读
    什么是<b class='flag-5'>头文件</b>?<b class='flag-5'>头文件</b><b class='flag-5'>编写</b>的一般格式要求是怎样?