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. [转]How to override HandleUnauthorizedRequest in ASP.NET Core

    本文转自:http://quabr.com/40446028/how-to-override-handleunauthorizedrequest-in-asp-net-core I'm migrati ...

  2. C++11 新特性: unordered_map 与 map 的对比

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  3. jdk、maven配置

    JDK环境变量配置1.新建系统变量 1)变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0_15 2)变量名:CLASSPATH 变量值:.;%JAVA_ ...

  4. Word隐藏回车符技巧

    每一次在Word中敲击回车时,都会留下一个回车符,回车次数多了回车符也就跟着变多了,这的确是太影响视觉效果了,我们要如何操作才能将这些回车符去掉呢?特意为大家献上Word2003和Word2007中隐 ...

  5. HTML5画布(圆形)

    案例1: <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8& ...

  6. [欧拉回路] hdu 3018 Ant Trip

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3018 Ant Trip Time Limit: 2000/1000 MS (Java/Others) ...

  7. The model backing has changed

    其他信息: The model backing the 'WebTopFormContext' context has changed since the database was created. ...

  8. 程序媛计划——python初级课时1~2

    在命令行中运行py文件:python 文件路径/文件名 python变量必须赋值后才能使用,因为py变量只有赋值后才会被创建. py可以同时给多个变量赋值:a,b,c = 10,20,'dfjkdj' ...

  9. Java多线程(汇聚页)

    Java多线程(汇聚页) Java多线程总结

  10. ZooKeeper系列(1)--分布式系统的基石

    分布式架构有以下几点普适性的共性需求: 1. 提供集群的集中化的配置管理功能,可以不重启就让新的配置参数生效,类似与配置中心      2. 简单可靠的集群节点动态发现机制,便于动态发现服务,动态扩展 ...