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. Linux压缩与解压缩文件

    1 将tgz文件解压到指定目录. tar zxvf test.tgz -C 指定目录 比如:将 test.tgz 解压到 /home目录:tar zxvf test.tgz -C /home 2 将指 ...

  2. C语言 九九乘法表

    #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int i,j,k; ...

  3. python3爬虫_环境安装

    一.环境安装 1.python3安装 官网:https://www.python.org/downloads/ 64 位系统可以下载 Windows x86-64 executable install ...

  4. mybatis获取insert插入之后的id

    一.为什么要获取insert的id 写了测试类测试插入,插入之后用select查询出来进行Assert 插入成功后,不管Select对比的结果成功还是失败,都希望删除掉测试插入的结果 二.运行环境 m ...

  5. javascript高级程序设计第3版——第1Java章 DOM扩展

    虽然DOM 为与XML 及HTML 文档交互制定了一系列核心API,但仍然有几个规范对标准的DOM进行了扩展.这些扩展中有很多原来是浏览器专有的,但后来成为了事实标准,于是其他浏览器也都提供了相同的实 ...

  6. xibai的PCI卡在英文系统上安装报错

    通过购买时自带的光驱,在里面直接找相对应的型号的驱动,直接安装,即可 不要通过电脑管理,然后更新驱动的这种方式,会报错

  7. easyui tagbox 自动触发回车事件

    新版本的 easyui 加入了 tagbox 控件,允许用户通过回车分隔的方式输入多项数据.但这个控件有一些不便,就是每输入完一项必须按回车键确认,用户很容易在输入完最后一项后忘记按回车就直接提交表单 ...

  8. 【调试基础】Part 1 寄存器

    01 寄存器体系 02 16/32/64位寄存器

  9. .net实现网易云音乐下载

    客户端版的网易云音乐下载是需要vip的,网页版的虽然可以通过调试工具找到下载链接,但是用起来不是很方便,通过调试工具观察请求发现请求参数都是加密的,比如搜索歌曲的请求参数: 这个加密的实现肯定是写在j ...

  10. Cross-Validation & Nested Cross-Validation

    分享stackexchange的一篇问答:https://stats.stackexchange.com/questions/11602/training-with-the-full-dataset- ...