微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C程序中关于c和h的包含问题

C程序中关于c和h的包含问题

时间:12-01 来源:互联网 点击:
首先声明一下:下面文章都是网络搜索结果,本人浮躁的心情决对没有时间这样仔细地解释问题的,所以我要感谢一下原作者,辛苦了!由于学STM32的关系,需要重点理解“看似没有调用,实际上却包含了”的技巧,这个技巧本人在没有读过文章之前还确实不理解。

*********************************************************************************************************************************************************************

很多人对C语言中的 “文件包含”都不陌生了,文件包含处理在程序开发中会给我们的模块化程序设计带来很大的好处,通过文件包含的方法把程序中的各个功能模块联系起来是模块化程序设计中的一种非常有利的手段。

文件包含处理是指在一个源文件中,通过文件包含命令将另一个源文件的内容全部包含在此文件中。在源文件编译时,连同被包含进来的文件一同编译,生成目标目标文件。

很多人再初学时都会对这个很晕,怎么写文件件? 怎么包含才能避免重定义? 等等问题。。。

其实这个只要了解了文件包含的基本处理方法就可以对文件包含有一个很好的理解与应用了,下来我们一起来看一下:

文件包含的处理方法:

首先大家需要清楚:

(1) 处理时间:文件包含也是以"#"开头来写的(#include ), 那么它就是写给预处理器来看了, 也就是说文件包含是会在编译预处理阶段进行处理的。

(2) 处理方法:在预处理阶段,系统自动对#include命令进行处理,具体做法是:降包含文件的内容复制到包含语句(#include )处,得到新的文件,然后再对这个新的文件进行编译。

抓住这两点,那么这个东东就没有什么难的了。。。

一般情况下文件包含分为两种:包含.h文件 和 包含.c文件

1. 当然对于这两情况也都是按照上面说的方法来处理的。呵呵,这个肯定是没得说的.

2.包含.c文件 和编译多文件程序 是不同的。
多文件程序:是在源文件编译时把多个文件进行编译、连接在一起生成一个可执行文件。
包含.c文件:按照我们上边的说法则是把多个文件合并为一个文件进行编译。

接下来通过例子看一下:
(1)包含.c文件:

1://file1: main.c

2:#include

3:#include"fun.c"

4:intmain()

5:{

6:inta=5,b=19;

7:c = a;

8:sun(a,b);

9:printf("c=%d",c);

10:return0;

11:}

12://end of file1

1://file2: fun.c2:intc=0;3:voidsun(inta,intb)4:{5:printf("a+b=%d",a+b);6:c=0;7:printf("c=%d",c);8:}9://end of file210:

这个例子是采用 包含.c文件 的方法实现的。

在编译时,直接去编译main.c文件,预处理器会先把fun.c文件中的内容复制到main.c中来,然后再对新的main.c进行编译。
编译命令:
gcc main.c -o main

可以看到,这里并没有对fun.c进行编译,但还是生成了最终的main可执行程序。

也可以通过命令来观察一下预处理的结果:

编译命令:
gcc -E main.c -o main.cpp
在main.cpp文件末尾可以看来下面一段代码:

1://main.cpp文件中2:931 # 2"main.c"23:932 # 1"fun.c"14:933//注意这里是fun.c里边的内容5:934intc=0;6:935voidsun(inta,intb)7:936 {8:937 printf("a+b=%d",a+b);9:938 c=0;10:939 printf("c=%d",c);11:940 }12://这里是main函数13:941 # 3"main.c"214:942intmain()15:943 {16:944inta=5,b=19;17:945 c = a;18:946 printf("c=%d",c);19:947 sun(a,b);20:948 printf("c=%d",c);21:949return0;22:950 }

可见,其实就是将fun.c文件中的内容添加到了main函数之前,然后对新的文件进行编译,生成最终的可执行程序。

(2)编译多文件程序:
同样是上边的例子,把main.c中“ #include "fun.c" ”注释掉,加上一句:“extern int c;”因为 c 变量在另外一个文件(fun.c)中定义。

1://file1: main.c2:#include3://#include "fun.c" //注释掉4:externintc;//添加这一句5:intmain()6:{7:inta=5,b=19;8:c = a;9:sun(a,b);10:printf("c=%d",c);11:return0;12:}13://end of file114:15:16://file2: fun.c17:intc=0;18:voidsun(inta,intb)19:{20:printf("a+b=%d",a+b);21:c=0;22:printf("c=%d",c);23:}24://end of file2

这次如果还是按照上面的方法只编译main.c的话就会出错,因为变量c和函数sun并没有在main.c中定义,所以编译时需要将fun.c一起编译:
编译命令:

gcc -c main.c -o main.o #编译main.c
gcc -c fun.c -o fun.o#编译fun.c
gcc main.o fun.o -o main#用main.o fun.o生成main

到这里大家应该已经理解包含.c文件和多文件程序的本质区别了~~~

好了,大家不防想想这两种

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top