.c和.h的联系
.c文件就是C语言系列的源文件,而H文件则是C语言的头文件,即C系列中存放函数和全局变量的文件,因为C中的函数是被封装起来的,即无法看到其代码。
子程序不要定义在*.h中。函数定义要放在*.c中,而*.h只做声明.否则多引用几次,就会发生函数重复定义的错误。*.h只做声明,编译后不产生代码。这样做目的是为了实现软件的模块化,使软件结构清晰,而且也便于别人使用你写的程序。
纯粹用 C 语言语法的角度,你当然可以在*.h 中放任何东西,因为 #include 完全等价于把*.h 文件 Ctrl-C Ctrl-V 到*.c 中,*.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能干什么、该怎么用”。*.c 中是所有变量和函数的定义,告诉计算机你的程序“该怎么实现”。当然,如果一个*.h 被多个*.c 包含,而且*.h 中有对象(变量或函数)的定义,就会发生重复定义的错误了,声明可以无穷多次,定义只能一次。
一般来说,一个C文件应该是一个模块,如果你的程序仅仅有一个模块(仅仅一个C文件),就可以不用建立H文件了。否则你的模块肯定不是独立的,你的模块里面的实现要被别的模块调用。这个时候你最好生成一个头文件(H文件),在头文件里面可以声明你的那些函数是公共的。当别的模块包含你的头文件后,就可以使用你的公共声明了。
一个C对应一个H,这样管理起来方便,比如你有一个"my.c",那么就再添加一个"my.h":
1 #ifndef _MY_H 2 #define _MY_H 3 externvoidmy(void); 4 #endif
其实在H文件里写函数也无所谓,只是不符合习惯而已。只要按照以上的格式写,一个H文件添加多少次都无所谓,呵~
Come from: http://topic.csdn.net/t/20060429/15/4723725.html
简单的说,其实要理解C文件与H文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:
1.预处理阶段
2.词法与语法分析阶段
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。
编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!
有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:
#include<stdio.h> #include"mytest.h" int main(int argc,char**argv) { test =25; printf("test.................%d\n",test); }
mytest.h文件的内容:
1 | int test; |
//a.h void foo();
1 //a.c 2 #include"a.h"//我的问题出来了:这句话是要,还是不要? 3 void foo() 4 { 5 return; 6 }
1 //main.c 2 #include"a.h" 3 int main(int argc,char*argv[]) 4 { 5 foo(); 6 return0; 7 }
它的解答如下:
1.不一定。这个例子中显然是多余的。但是如果.c中的函数也需要调用同个.c中的其它函数,那么这个.c往往会include同名的.h,这样就不需要为声明和调用顺序而发愁了(C语言要求使用之前必须声明,而include同名.h一般会放在.c的开头)。有很多工程甚至把这种写法约定为代码规范,以规范出清晰的代码来。
2.答:1中已经回答过了。
3.答:不会。问这个问题的人绝对是概念不清,要不就是想混水摸鱼。非常讨厌的是中国的很多考试出的都是这种烂题,生怕别人有个清楚的概念了,绝对要把考生搞晕。
通常情况下a.c包含a.h,一般是因为a.h里面定义了一些a.c里面使用的一些宏,同时它里面声明了a.c里面定义的,一些给a.c之外的.c文件用的函数,这样的话其他.c文件要使用a.c里面的函数,就只需要#include "a.h"就行了。
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步