C语言的著作中,至今还没发现把.h文件的用法写的透彻的。在实际应用中也只能依葫芦画瓢,只知其然不知其所以然,甚是郁闷!闲来无事,便将搜集网络的相关内容整理一下,以便加深自己的理解

理论概述:
.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。

1)h文件作用:

1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;

  2. 使函数的作用域从函数声明的位置开始,而不是函数定义的位置(实践总结)

  3 .提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。

2)h文件里应该有什么:常量,结构,类型定义,函数,变量申明。

3)h文件不应该有什么:变量定义, 函数定义。

4)extern问题:
  1.对于变量需要extern;

  2.对于函数不需要因为函数的缺省状态是extern的.如果一个函数要改变为只在文件内可见,加static。

5)include包含问题:虽然申明和类型定义可以重复,不过推荐使用条件编译。
  #ifndef _FILENAME_H, 
  #define _FILENAME_H
  ……

  #endif

实践总结:

先看最简单的程序:hello world

1 /*test1.c*/
2 main()
3 {
4   printf("Hello World!\n");
5 } 

注意,test1中并没有.h文件,编译可以顺利通过。把程序做下改动,下面这个:

1 /*test2.c*/
2 prtstr()
3 {
4   printf("Hello World!\n");
5 }
6 main()
7 {
8     prtstr();
9 }

test2.c中还是没有.h文件,编译仍可以顺利通过。再把程序改动下:

 1 /*test3.c*/
2 main()
3 {
4   prtstr();
5 }
6
7 prtstr()
8 {
9   printf("Hello World!\n");
10 }

test3.c中仍然没有.h文件,编译失败→_→。难道函数的位置影响编译的过程?现在我们来熟悉一下C语言中的概念:作用域。

  我们在这里只讲述与.h文件相关的顶层作用域, 顶层作用域就是从声明点延伸到源程序文本结束, 就prtstr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到文件结束, 也就是说,在test2.c的main()函数的引用点上,已经是他的作用域。 test3.c的main()函数的引用点上,还不是他的作用域,所以会编译出错. 这种情况怎么办呢? 有两种方法 ,一个就是让我们回到test2.c, 顺序对我们来说没什么, 谁先谁后不一样呢,只要能编译通过,程序能运行, 就让main()文件总是放到最后吧。那就让我们来看另一个例程,让我们看看这个方法是不是在任何时候都会起作用.

/*test4.c*/
2 play2()
3 {
4      play1();
5 }
6
7 play1()
8 {
9       play2();
10 }
11
12 main()
13 {
14      play1();
15 } 

这就是经常用到的一种算法, 函数嵌套。play1 和play2 这两个函数哪个放到前面呢?这时就需要我们来使用第二种方法,使用声明.

1 /*test5.c*/
2 play1();
3 play2();
4
5 play2()
6 {
7   play1();
8 }
9   play1()
10 {
11   play2();
12 }
13 main()
14 {
15   play1();
16 } 

一个大型的软件项目,可能有几千个,上万个 play, 而不只是 play1,play2这么简单, 这样就可能有 N 个类似 play1(); play2(); 这样的声明, 这个时候就需要我们想办法把这样的 play1(); play2(); 另行管理, 而不是把他放在.c文件中, 于是.h 文件出现了.

1 /*test.h */
2 play1();
3 play2();
4 /* test6.C */
5 #include “test.h”
6 play2()
7 {
8   play1();
9 }
10 play1();
11 {
12   play2();
13 }
14 main()
15 {
16   play1();
17 } 

上面是.h文件的最基本的功能。

c头文件(.h)的作用相关推荐

  1. extern与头文件(*.h)的区别和联系

    原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

  2. 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)

    单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...

  3. #ifndef在头文件中的作用

    #ifndef出现在所有头文件中,似乎成了定式.他在头文件中的作用是防止头文件被include多次. 给个例子: #ifndef HEADERFILE_H #define HEADERFILE_H / ...

  4. C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143    语法错误: 缺少")"(在"*"的前面) (编 ...

  5. #ifndef 在头文件中的作用

    在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量"重定义"的错误.在头文件中实用#ifndef #define #e ...

  6. 个人学习之C++ 头文件.h与.cpp

    最近在学习的过程中发现这个问题,因为是学习所以内容对网上的内容有很多参考 在一个C++程序中,只包含两类文件--.cpp文件和.h文件. 一.初步了解 1.头文件的作用:  方便函数的统一的声明 2. ...

  7. [C++] C语言及C++语言中包含的头文件名称,及作用

    头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...

  8. c++ 头文件 .h 理解与实践

    头文件如何来关联源文件? 这个问题实际上是说,已知头文件"a.h"声明了一系列函数(仅有函数原型,没有函数实现),"b.cpp"中实现了这些函数,那么如果我想在 ...

  9. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!

    在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

最新文章

  1. 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理
  2. mysql 函数rep_Mysql之各种各样的函数啦
  3. IBatis.Net学习笔记系列文章
  4. [待总结]各种中文乱码分析与处理:数据库、eclipse、linux to windows、web应用
  5. Runtime类及其常用方法
  6. python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引
  7. table tr th td
  8. python读取npy文件的列表_Python,NPY文件,pk3,Python3,读取,h5pklnpznpy,格式,的
  9. (06)FPGA工程师能力
  10. tokengetall php,token_get_all Split given source into PHP tokens php函数分享
  11. ORACLE EBS CUX用户的创建(转)
  12. 清理数据_Python数据清理终极指南(2020版)
  13. div在html中的好处,详解DIV+CSS布局的好处和意义
  14. java基础习题_JAVA基础练习题
  15. 搜狐新闻数据400w+
  16. 修改手机屏幕刷新率_手机屏幕刷新率真的越高越好吗?
  17. word 方框打勾_复制拿走即用
  18. 大聊Python----Select解析
  19. tomcat国内下载地址
  20. Bugku web(1—35)

热门文章

  1. 机房收费系统——UML用例图
  2. 4.使用Keras和Tensorflow Hub对电影评论进行文本分类
  3. Linux---压缩解压命令
  4. 北大毕业的山区小学校长,给清华老朋友派了一个紧急任务
  5. 轻松搞定PMP考试的计算题---挣值管理(EVM)
  6. PHY--RSRP、RSRQ、RSSI和SINR
  7. java怎么把毫秒转换成天数_Java 毫秒转换为日期类型、日期转换为毫秒
  8. Flowmaster2020.1安装之后数据库配置问题
  9. LabVIEW开发汽车惯性导航系统测试
  10. 酷睿i3能当服务器系统吗,i3能装64位系统吗 i3处理器装64位系统行不行