关闭

c头文件(.h)的作用

标签: .hc语言
893人阅读 评论(0) 收藏 举报
分类:

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.cmain()函数的引用点上,已经是他的作用域。 test3.cmain()函数的引用点上,还不是他的作用域,所以会编译出错这种情况怎么办呢有两种方法 ,一个就是让我们回到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这么简单这样就可能有 个类似 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文件的最基本的功能。


2
0
查看评论

.h头文件的作用

   .h头文件以前也没觉得如何的难用,总是在需要的时候就随手包含了进去,但现在看这些代码,总感觉心里不踏实,不知道在什么时候需要包含,什么时候没有必要包含,vc编译器在编译的时候是怎么处理.h和.cpp文件的,主要是对编译器原理太不熟悉,没办法,今天特意开辟了半天的时...
  • ggq04022082
  • ggq04022082
  • 2010-04-12 22:51
  • 8837

C/C++头文件.h和没有.h的区别

iostream是C++的头文件,iostream.h是C的头文件,即标准的C++头文件没有.h扩展名,将以前的C的头文件转化为C++的头文件后,有时加上c的前缀表示来自于c,例如cmath就是由math.h变来的。 iostream.h里面定义的所有类以及对象都是在全局空间里,所以你可以直接...
  • zjllike
  • zjllike
  • 2011-11-22 16:45
  • 5048

头文件在.c/.cpp中引用和.h文件引用

头文件在.c/.cpp中引用和.h文件引用a.h 头文件中的变量 .cpp文件函数的相互调用
  • qq_35452533
  • qq_35452533
  • 2017-08-16 23:56
  • 703

c语言中.h文件的作用

.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。 .h文件作用 1.方便开发:包含一些文件需要的共同的常量、结构、类型定义,函数声明,变量声明。 2.使函数的作用域从函数声明的位置开始,而不是函数定义的位置。 3.通过头文件来调用库功能。在很多场合,源代...
  • u012385733
  • u012385733
  • 2015-09-17 13:23
  • 616

C++中头文件有什么作用?

一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也...
  • chillon_liao
  • chillon_liao
  • 2015-03-14 18:40
  • 6528

.h头文件 .lib库文件 .dll动态库文件之间的关系

.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。 .h .lib...
  • yusiguyuan
  • yusiguyuan
  • 2013-10-12 11:56
  • 16946

DSP .c 和.h文件架构

test.c文件构架 1、包含本文件对应头文件test.h 2、定义仅供本文件内部使用全局变量:用static修饰 3、定义可供外部文件使用的全局变量 4、引用外部文件定义的全局变量的申明:加extern 5、为本文件内定义的函数分配存储空间 test.h文件架构 1、条件编译,以防头文件被重复...
  • u010264931
  • u010264931
  • 2015-10-12 13:32
  • 831

【转】结构体定义在头文件.h中和定义在.c中的不同考虑

C语言中对于结构的定义一般放在.h中还是.c中 http://www.oschina.net/question/999013_92593?sort=default&p=1    点击打开链接 ——如果其可见性超出一个.c文件,那么应当放入.h中,如果只是某个.c里需...
  • tong_xin2010
  • tong_xin2010
  • 2014-12-12 16:30
  • 4916

C/C++头文件的作用和用法

头文件是C/C++程序不可缺少的组成部分。使用头文件,应该注意头文件的作用和用法相关知识点。1.头文件的作用C/C++编译器采用的是分离编译模式。在一个项目中,有多个源文件存在,但是它们总会有一些内容是相同的,如使用相同的用户自定义类型、使用了相同的全局变量等。因此,将这些内容抽取出来放到头文件中,...
  • K346K346
  • K346K346
  • 2015-10-03 13:03
  • 7903

C中.h头文件的写法

C中.h头文件的写法 Michael Barr建议: 1. 系统中为每个功能模块创建一个.h头文件。    一个功能模块实现系统的一个方面功能,它可能由多个.c和.asm文件来实现,为它创建一个.h头文件。 2.把一个模块的公共接口的函数原型...
  • lsy5631932
  • lsy5631932
  • 2013-10-19 13:38
  • 4325
    个人资料
    • 访问:1094048次
    • 积分:13436
    • 等级:
    • 排名:第1163名
    • 原创:334篇
    • 转载:21篇
    • 译文:0篇
    • 评论:186条
    博客专栏
    最新评论