c语言头文件的认识
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语言头文件的认识的更多相关文章
- c语言头文件中定义全局变量的问题
c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...
- 嵌入式C语言头文件的建立与使用
如何正确编写 C 语言头文件和与之相关联的 c 源程序文件,这首先就要了解它们的各自功能. 要理解 C 文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程. 一般说来编译器会做以下几 ...
- 51单片机C语言学习笔记6:51单片机C语言头文件及其使用
很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...
- C语言头文件
最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比 ...
- C++标准库头文件名字和C语言头文件名字的区别
1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...
- C语言头文件的使用(转载)
C语言头文件的使用 ——by janders 转载请注名作者和出处,谢谢! C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐 ...
- C语言头文件、库文件的查找路径
在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个 ...
- 用CBrother将excel中的数据转换为C语言头文件
用CBrother将excel中的数据转换为C语言头文件 最近在工作中,产品这边总是要调整一些参数,而我们在这一块要求所有的配置必须用宏定义来做,因为不同型号直接硬编码写死在代码里,但是一但数量大了, ...
- C语言头文件怎么写?(转载)
---恢复内容开始--- c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码,还在 ...
- [转载]C语言头文件的作用
最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学 习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是 ...
随机推荐
- MAVEN中的Scope
Dependency Scope 在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用6个值: *im ...
- Ubuntu - Start - 必要软件安装
1.安装Chromium浏览器 sudo apt install chromium-browser 如果出错, 先更新下apt sudo apt update 2. 安装rime输入法 sudo ap ...
- 2018-2019-2 20165303《网络攻防技术》Exp5 MSF基础应用
实践目标 1.一个主动攻击实践 ms17_010(成功) ms08_067(成功) 2.一个针对浏览器的攻击 ms13-008(成功唯一) ms11-050(失败) ms13-069(成功唯一) ad ...
- spoj839Optimal Marks
题意:略 怎样判断属于S,T集合. 如果从S出发到不了某点,该点出发也到不了T,那么割给那边都行. 如果S出发能到该点,该点出发也能到T,这种情况下dinic没结束. 只能从S到该点:只能分到S集.只 ...
- BUAA_OO第一单元作业总结
BUAA_OO第一单元作业总结 单元任务 第一单元的任务为实现表达式的求导,其中第一次作业是对简单多项式的求导,第二次作业是对包含简单幂函数和简单正余弦函数的多项式的求导,第三次作业是对包含简单幂函数 ...
- C++ DWORD 转byte char 数组、指针
C++ DWORD 转byte char 数组.指针 byte byteData[1024]; // byte数组,示例 DWORD dwData = dwReadBytes; // dword数据, ...
- Robot Framework--Selenium2Library库3
1.介绍 Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支持所有基于 web 的管理任务自动化.Selenium 的特点: 开源,免费 多浏览 ...
- Git版本库管理
Step 1 查看哪些历史提交过文件占用空间较大 使用以下命令可以查看占用空间最多的五个文件: git rev-list --objects --all | grep "$(git veri ...
- Nginx 作用
django 请求的生命周期 Nginx 的作用: 浏览器 --- nginx(反向代理器)-- uwsgi --- django项目nginx : 负载均衡, 将任务分发给不同的uwsgi 动静分离 ...
- DomeOS部署
http://gitbook.domeos.org/ 按照官方一键部署脚本完之后,发现监听的IP地址是在IPv6上面. vim /etc/default/grubadd ipv6.disable=1 ...