c头文件的作用是什么,和.c文件是怎么联系的,该怎么样编写头文件呢?这些问题我一直没搞明白,在阅读uCOS-II(邵贝贝)“全局变量”部分有些疑惑,今天终于搞清楚了头文件的一些基础知识,特地分享一下。

<一>头文件的作用和内容

  当写一个小程序的时候,可以将所有代码放在一个.c文件中。当写一个大项目是,由于代码量很多,就需要将代码分开,就出现了多个.h和.c文件。我认为.h文件的主要作用是将所有.c文件连接起来,即使.c文件的内容互相调用成为可能。先看下最简单的代码:

//main.c
1 int a;
int main()
{
a = ;
return ;
}

这段代码没有头文件,依旧可以执行。讲到这,不得不提一下编译器编译的步骤:

  1.预处理:预处理过程实质上是处理“#”,将#include包含的头文件直接拷贝到.c文件当中;将#define定义的宏进行替换,同时将代码中没用的注释部分删除等。(后面编译的步骤是编译,汇编,链接)

那么.h中的文件内容到底是什么呢?最基本的内容:extern变量、(extern)函数的声明,宏定义;网上说一般不提倡将变量定义,函数定义放在.h文件中。这种说法我认为是错误的,不是不提倡,就是不能。在实际工作中这会产生极大的错误。先将正确的内容:

首先变量声明和函数声明是不同的。例如:extern void f(); 等价与void f(); ,  extern int f;不等价于int f;(extern int f ; 是声明变量f,int f ; 是定义变量f),所以函数声明两种写法都行,声明可以有多个,定义只能有一个。

上面那个最简单的程序,也可写.h+.c的形式:

//test.h
1 #ifndef TEST_H
#define TEST_H
extern int a;
#endif
//test.c
1 #include "test.h"
int a;
//main.c
1 #include "test.h"
int main()
{
a = ;
return ;
}

预处理完成后的代码:

//预处理后main.c
1 extern int a;
int main()
{
a = ;
return ;
}

将到这,就需要知道extern 的作用了:extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的。找到了定义,和直接定义是一样的吧。

<二>头文件和.c文件是怎么联系的                            

  通过extern联系。

<三>怎么样编写头文件

  网上的教程有很多,写头文件的基本原则:1.不要将定义放在头文件,容易造成重复定义的错误。

                     2.只能有一个定义,可以有多个声明。

                     3.xxx.h写出xxx.txt也能编译通过。      

c语言头文件的认识的更多相关文章

  1. c语言头文件中定义全局变量的问题

    c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...

  2. 嵌入式C语言头文件的建立与使用

    如何正确编写 C 语言头文件和与之相关联的 c 源程序文件,这首先就要了解它们的各自功能. 要理解 C 文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程. 一般说来编译器会做以下几 ...

  3. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  4. C语言头文件

    最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比 ...

  5. C++标准库头文件名字和C语言头文件名字的区别

    1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...

  6. C语言头文件的使用(转载)

    C语言头文件的使用 ——by janders 转载请注名作者和出处,谢谢! C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐 ...

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

    在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个 ...

  8. 用CBrother将excel中的数据转换为C语言头文件

    用CBrother将excel中的数据转换为C语言头文件 最近在工作中,产品这边总是要调整一些参数,而我们在这一块要求所有的配置必须用宏定义来做,因为不同型号直接硬编码写死在代码里,但是一但数量大了, ...

  9. C语言头文件怎么写?(转载)

    ---恢复内容开始--- c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码,还在 ...

  10. [转载]C语言头文件的作用

    最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学 习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是 ...

随机推荐

  1. 在Python中使用SMTP发送电子邮件

    Python中有内置的smtplib模块,完成一封邮件的发送,需要做很多准备工作.第三方的py_smtp这个包也是基于smtplib的,在Python中使用py_smtp发送电子邮件非常方便,只要填写 ...

  2. Django 应用程序 + 模型 + 基本数据访问

    如果你只是建造一个简单的web站点,那么可能你只需要一个app就可以了.如果是复杂的象 电子商务之类的Web站点,你可能需要把这些功能划分成不同的app,以便以后重用. 确实,你还可以不用创建app, ...

  3. PAT 1144 The Missing Number

    1144 The Missing Number (20 分)   Given N integers, you are supposed to find the smallest positive in ...

  4. 网络爬虫&起点中文网完本榜500部小说

    # 网络爬虫爬取起点中文网完本榜小说500部# 四步,分步操作,不易出错# 所需要获取的数据:书名 .作者.网址.类型.主要介绍.作品信息 from urllib.request import * # ...

  5. C#中,子类构造函数调用父类父类构造函数的正确方式

    正确调用的方式是:

  6. 汇编语言实验1 & macOS下DOSBox的安装

    一.macOS下DOSBox的安装 1.在官网下载DOSBox-0.74.dmg 打开,此时默认z盘 一番折腾,终于搞定debug 然后为了不用每次都执行mount,遂更改配置文件自动挂在目录 再次打 ...

  7. 进到页面后input输入框自动获取焦点

    <html>    <head></head>    <body>        用户名:<input type="text" ...

  8. python requests + xpath 获取分页详情页数据存入到txt文件中

    直接代码,如有不懂请加群讨论# *-* coding:utf-8 *-* #import jsonimport requestsimport pytesseractimport timeimport ...

  9. 带你领略Linux系统发展及版本更迭

    Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...

  10. WPF listbox实现多列显示数据

    一.每行显示固定列数 <ListBox ItemsSource="{Binding DataList}" Style="{DynamicResource ListB ...