C语言程序中,源文件通常分为两种:一种用于保存程序的声明(declaration),称为头文件;另一种用于保存程序的实现(implementation),称为定义(definition)文件。 C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀。

可以将 .h 文件的内容写在 .c 文件中,也可以将 .c 文件的内容写在 .h 中,但这是很不好的习惯。许多初学者用了头文件,却不明其理。在此略作说明。

在以下场景中会使用头文件:

  • 通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功 能,而不必关心接口怎么实现的。
  • 多文件编译。将稍大的项目分成几个文件实现,通过头文件将其他文件的函数声明引入到当前文件。
  • 头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

编译时只有函数声明没有函数定义是完全正确的。函数声明告诉编译器该函数已经存在,但是入口地址还未确定,暂时在此做个标记,链接时编译器会找到函数入口地址,并将标记替换掉。

编译产生的 .obj 文件(Linux下为 .o 文件)已经是二进制文件,与 .exe 的组织形式类似,只是有些函数的入口地址还未找到,程序不能执行。链接的作用就是找到函数入口地址,将所有的源文件组织成一个可以执行的二进制文件。

关于头文件的内容,初学者还必须注意:

  • 头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不要写具体的语句。
  • 可以申明函数,但不可以定义函数。
  • 可以申明常量,但不可以定义变量。
  • 可以“定义”一个宏函数。注意:宏函数很象函数,但却不是函数。其实还是一个申明。
  • 结构的定义、自定义数据类型一般也放在头文件中。
  • #include <filename.h>,编译系统会到环境指定的目录去引用。#include "filename.h",系统一般首先在当前目录查找,然后再去环境指定目录查找。

好的风格是成功的关键,版本申明、函数功能说明、注释等是C语言程序的一部分。不养成很好的习惯则不能成为C语言高手(专业人员)。

C标准库中,每一个库函数都在一个头文件中声明,可以通过 #include 预处理命令导入。

头文件只是声明,不占内存空间,编译时会被合并到源文件;要想知道它的具体实现,要看头文件所声明的函数是在哪个 .c 文件里定义的,然后查看源代码。

C标准库共包含 15 个头文件,可以分为 3 组,如何正确并熟练的使用它们,可以相应的可区分出 3 个层次的程序员:

  • 合格程序员:<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>
  • 熟练程序员:<assert.h>、<limits.h>、<stddef.h>、<time.h>
  • 优秀程序员:<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>

各个头文件的具体内容请查看: C语言标准库

C语言头文件具有以下几个特性:

  • 幂等性。可以多次包含相同的标准头文件,但效果与只包含一次相同。
  • 相互独立。任何标准头文件的正常工作都不需要以包含其他标准头文件为前提。也没有任何标准头文件包含了其他标准头文件。
  • 和文件级别的声明等同。必须先把某标准头文件包含到你的程序中, 然后才能使用该头文件已定义或声明的东西。不能在声明中包含标准头文件。并且,也不能在包含标准头文件之前用宏定义去代替关键字。

等幂性是很容易实现的,对于大多数的头文件可以使用宏保护。例如,在 stdio.h 中可以有如下的宏定义:

  1. #ifndef _STDIO_H
  2. #define _STDIO_H
  3. /* 主要实现部分 */
  4. #endif

在C程序员中所达成的一个约定是:C源文件的开头部分要包含所有要用到的头文件。在 #include 指令之前只能有一句注释语句。引入的头文件可以按任意顺序排列。

如果我们自己编写的头文件可能会用到标准头文件中的定义或者声明,最好把标准头文件包含在自定义头文件的开头。这样,就不会在程序中忘记引入该标准头文件,也不会有顺序问题。这正是利用了头文件的等幂性。

注意一个约定,引入标准头文件用尖括号,引入自定义头文件用双引号,例如:

  1. #include <stdio.h>
  2. #include "myFile.h"

C语言库函数是头文件的最佳实践,仔细阅读各个头文件的内容,尤其是 stdio.h,能够学到很多东西。

在 VC6.0 中找到头文件

C标准头文件,例如 stdio.h、string.h 等在 VC6.0 的安装目录中是可以找到的。我的 VC6.0 安装在 C:\Program Files\Microsoft Visual Studio\ 目录,那么 VC6.0 附带的所有头文件(包括但不限于标准头文件)都在 C:\Program Files\Microsoft Visual Studio\VC98\Include\ 目录下。

如果忘记 VC6.0 的安装目录或者头文件不在安装目录下,可以通过以下方式找到:

1) 在工具栏中点击“工具”按钮

2) 在二级菜单中选择“选项”

3) 在弹出的对话框中选择“目录”标签

4) 然后选择名字为“目录”的下拉菜单中的“Include files”一项,如下图所示:

转自:http://see.xidian.edu.cn/cpp/html/2570.html

C语言头文件深入理解相关推荐

  1. C语言头文件路径相关问题总结说明

    聊聊系统路径位置,绝对路径与相对路径,正斜杠 `/` 与 反斜杠 `\` 使用说明 ...... by 矜辰所致 目录 前言 一.C语言中的头文件引用 二.KEIL 中的头文件路径 2.1 Incud ...

  2. C语言头文件和源文件差异,#include两种引用方式差异

    一些初学c语言的人,不知道头文件(*.h文件)原来还可以自己写的.只知道调用系统库函数时,要使用#include语句将某些头文件包含进去.其实,头文件跟.c文件一样,是可以自己写的.头文件是一种文本文 ...

  3. 【炒鸡萌新向】关于C语言头文件的解释

    [炒鸡萌新向]关于C语言头文件的解释 总所周知,c语言是一个令人秃头的语言.而刚入门的萌新们一定对编译器上方的头文件摸不着头脑.别说什么理解了,看都看不懂是什么玩意那别说怎么理解这段语言所代表的含义了 ...

  4. c语言程序头文件作用,C语言头文件

    C语言头文件教程 C 语言的头文件一般都是 .h 做为结尾的. C语言头文件详解 语法 #include 参数 参数 描述 filename 我们需要引入的头文件的名称. 说明 C 语言的头文件一般都 ...

  5. C语言头文件避免重复包含

    C语言头文件避免重复包含 假定有以下几个头文件及其包含关系为: File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp 那么:file3.h包含file1.h ...

  6. C语言头文件、库文件的查找路径

    一.讨论环境 *操作系统:Redhat5/Fedora14 *编译器:gcc 4.5.1 以下言论仅确保在以上环境中,绝对正确.别的环境,大家可以通过类比方法,得到启示. 二.C语言头文件的查找路径 ...

  7. 如何写一个C语言头文件,C语言头文件如何写?.doc

    C语言头文件如何写? 沃直植跑决争肾垮忧地留许腐榔锑舱黎徒礁锄税絮窟柑冀宴稼误萎蛛席脏衙鹏丢寇急院馋猎争城丫轨最懦患队巩并道嫉缘拉诵旭倘荫惭岩靛约瞥剑澳摈讶蕾沈蜜荧次侧抿两洛加悠馈射移淳敏凹肮复钡桑缮 ...

  8. 51单片机C语言程序100例分析(1)IO+C语言+头文件

    51单片机C语言程序100例分析(1)IO+C语言+头文件 \\\插播一条:文章末尾有惊喜哟~///  P1=0xfe;//P1=11111110B,即P1.0输出低电平} 分析:通过这短短的几行代码 ...

  9. c语言头文件包含嵌套问题和包含原则

    a.h #include<stdio.h> #ifndef _A_H #define _A_H 只是解决头文件重复包含的问题的,但是头文件嵌套包含,就不代表不会出问题,就会关系错综复杂,出 ...

最新文章

  1. 2018 蓝桥杯省赛 B 组模拟赛(一)-年龄
  2. Facebook :AI 年度总结来啦
  3. JS仿淘宝关闭二维码案例
  4. xhan/qqbot试用
  5. Docker创建 tomcat/weblogic 集群
  6. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用
  7. OpenShift Origin中的Kubernetes Spark运算符(第1部分)
  8. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(7) - 状态清除指令 小结
  9. [hihocoder][Offer收割]编程练习赛46
  10. ARCGIS操作教程学习
  11. 51单片机模拟交通灯c语言程序,51单片机protues仿真——LED模拟交通灯
  12. AWVS 12下载与破解
  13. PG数据库创建视图并授权给新用户
  14. 怎么制作linux光盘镜像,linux光盘镜像文件制作攻略
  15. 静态HTML网页设计作品网站设计——仙灵游戏网站首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品
  16. P6207 [USACO06OCT] Cows on Skates G
  17. 《Android之大话设计模式》--设计原则 第二章:单一职责原则 乔峰VS慕容复
  18. 硕士学位论文写作分享
  19. 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。
  20. 微众银行Solidity智能合约库:区块链工程师的随身工具箱

热门文章

  1. 初试Windows 8 RTM
  2. TIBCO宣布接近达成收购LogLogic
  3. [原创]Fluent NHibernate之旅
  4. 洞悉物联网发展1000问之物联网会产生哪些独角兽?机会在哪里?
  5. git仓库迁移(全部分支)
  6. ubuntu创建文件夹快捷方式命令
  7. Qt Creator 快捷键
  8. POJ-1655 Balancing Act 树的重心
  9. ASP.NET 2.0 XML 系列(2): XML技术
  10. 网上书店黑盒测试_网上书店系统测试计划书.doc