c头文件(.h)的作用

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

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

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

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


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

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

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

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

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

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

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


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


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VS2012中实现Ext JS的智能提示太简单了

Visual Studio 2012太强大了,居然能自己会去提取Ext JS的类的属性和方法,从而实现只能提示。下面就来介绍一下实现这个功能。在Visual Studio 2012中随便创建一个Web项目,我创建了一个空的Web项目,目录结构如下图所示:…

tomcat bug之部署应用的时候经常会发上startup failed due to previous errors

在tomcat上部署应用的时候经常会发上startup failed due to previous errors错误。这个错误产生以后经常会让人摸不到头脑。以下是几点查找经验: 1.web.xml文件,这个文件中定义了很多web服务启动需要的类、xml文件,如果这些找不到就会发生sta…

mybatis 查询之神坑

先看一个示例: 数据表数据: mybatis类和查询语句: 1. 当UserInfoMap中所有字段(包含association)都为NULL的话,getUserInfo的返回结果是个null,即使查询的记录存在!运行结果如下: 2019-06-26 …

微软万圣节文件

为什么80%的码农都做不了架构师?>>> http://www.aka.org.cn/Docs/halloween/halloweenDoc.html 微软万圣节文件 圣节文件在微软以外被用作称呼一系列来源可靠的备忘录,内容是微软总部用来对付开源软件(特别是Linux)的…

linux C 学习 简单字符串逆序输出

看了下网上的字符串逆序输出&#xff0c;都相对复杂&#xff0c;下面给一个简单的字符串逆序输出小程序实现: [cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; int n; …

【干货分享】流程DEMO-补打卡

流程名&#xff1a; 补打卡申请 业务描述&#xff1a; 当员工在该出勤的工作日出勤但漏打卡时&#xff0c;于一周内填写补打卡申请。 流程相关文件&#xff1a; 流程包.xml 流程说明&#xff1a; 直接导入流程包文件&#xff0c;即可使用本流程 表单&#xff1a; 流程&#xf…

从头学习linux C 冒泡法排序

下面是一个简单冒泡法排序&#xff0c;代码如下&#xff1a; [cpp] view plaincopy #include <stdio.h> #define LEN 10 int main() { int a,i,j; int ARRAY[10]{23,1,4,9,6,17,24,56,98,72}; printf("Display this array:\n"); …

2019年最流行的10个前端框架

From: http://blog.sina.com.cn/s/blog_18337e9c40102yt1x.html &#xfeff;2019年最流行的10个前端框架 从去年下半年开始&#xff0c;互联网行业慢慢进入寒冬&#xff0c;一些设计师也不得不重新找工作。关于求职这个事情&#xff0c;UI黑客之前写过一篇文章《面试了50多位…

【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)

通常&#xff0c;可以用scp完成两台主机间的文件传输任务&#xff0c;但在主机间未建立信任关系的情况下&#xff0c;scp每次都需要输入密码&#xff0c;用起来感觉不是很方便&#xff0c;之前这篇笔记介绍过不用输入密码执行脚本或传输文件的方法&#xff0c;但对于一些临时性…

Linux C 中断言assert()使用简介

assert()是一个调试程序时经常使用的宏&#xff0c;在程序运行时它计算括号内的表达式&#xff0c;如果表达式为FALSE (0), 程序将报告错误&#xff0c;并终止执行。如果表达式不为0&#xff0c;则继续执行后面的语句&#xff0c;它的作用是终止程序以免导致严重后果&#xff0…

SQL中group by的用法

group by即按照给定字段对结果集进行分组&#xff0c;从字面意义上理解就是根据“by”指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个“数据集”划分成若干个“小区域”&#xff0c;然后针对若干个“小区域”进行数据处理。 group by的写法&#xff1a; 1.select 字…

【Mac】tar 打包指定目录并排除某些目录或文件

如题&#xff0c;bash脚本如下&#xff1a; #!/bin/bashDIR$1 # 要打包的目标目录# 排除的目录列表 if [ "$1" "retail" ]; thenarray(logs lib target .idea .mvn) elif [ "$1" "manager" ]; thenarray(.idea update data/log d…

C#写文本文件如何写入回车换行符?

public void WriteLogFile(String input){//指定日志文件的目录string fname "C:\\Inetpub\\wwwroot\\CommonFunction\\upFile " "\\logfile.txt ";//定义文件信息对象FileInfo finfo new FileInfo(fname);//判断文件是否存在以及是否大于2Kif (finfo.E…

Linux C 数据结构---链表(单向链表)

上一篇我们讲到了线性表&#xff0c;线性表就是数据元素都一一对应&#xff0c;除只有唯一的前驱&#xff0c;唯一的后继。 线性表存储结构分为顺序存储、链式存储。 顺序存储的优点&#xff1a; 顺序存储的缺点&#xff1a; 链表就是典型的链式存储&#xff0c;将线性表L &am…

前端学PHP之文件操作(认真读读)

前面的话 在程序运行时&#xff0c;程序本身和数据一般都存在内存中&#xff0c;当程序运行结束后&#xff0c;存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据&#xff0c;或程序运行产生的结果&#xff0c;就需要把数据存储在文件或数据库。一般地&#x…

java 定时任务(三):cron表达式

From: https://www.cnblogs.com/sawyerlsy/p/7208321.html 一、完整的cron表达式由7位以空格分隔的时间元素组成&#xff0c;从左到右分别为&#xff1a;秒、分、时、日期、月份、星期几、年份。其中需要注意的有以下几点&#xff1a; 1. spring 4.x 的spring task中只支持前6种…

1.对程序的看法 2013.8.1

一、一个程序或者是一个项目&#xff0c;其实就是 数据库 与 程序 与 界面的集合。做程序主要就是处理它们三个 之间的关系 处理它们的经典模式就是MVC M model 数据库v view 显示 html css javascriptc con 控制器 编程语言 二、一个项目 就是类库与函数的集合 三、类库 ①构…

做值钱的事比赚钱更有意义

艾伦图灵是英国著名的数学家&#xff0c;二战时期&#xff0c;他在军方邀请下进行德国Enigma密码破译工作。Enigma是当时德国使用的一种加密系统&#xff0c;直到今天还被视为史上最可靠的加密系统之一。它由一个装满了复杂而精致元件的盒子构成&#xff0c;包括26个字母键盘、…

我为什么要立刻放弃 React 而使用 Vue?

From: https://baijiahao.baidu.com/s?id1607323518011007619&wfrspider&forpc CSDN 发布时间&#xff1a;18-07-29 19:28 现在&#xff0c;Vue.js 在 Github 上得到的星星数已经超过了 React。这个框架的流行度在不断增长&#xff0c;由于它并没有像 Facebok&#…