C语言中 .c和.h有什么区别
#include <stdio.h>
#include "fun.h"
int main(int argc, char *argv[])
{
printf("%d\n",fun(9,2));
system("PAUSE");
return 0;
}
再建一个fun.h:
int fun(int a, int b);
再建一个fun.c:
#include "fun.h"
int fun(int a,int b )
{
return a+b;
}
为什么必须先建一个fun.h再建一个fun.c而不直接把这两个写在一起当做fun.h呢?
那位大虾有空,解释一下下。。谢谢了 展开
一、意思不同
.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
.c文件一般放的是变量、数组、函数的具体定义。
二、用法不同
.c文件,以c为扩展名,一般存储具体功能的实现。
.h文件,称为头文件,一般存储类型的定义,函数的声明等。通常,头文件被.c文件包含,使用#include 语句。但值得注意的是,这只是一种约定,而非强制。
三、作用
如果在h文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此h 文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错。
如果在h文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此h文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编 译器就会将此变量放入DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空 间,而不是多份空间,假定这个变量在h文件没有赋初值,编译器就会将之放入BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间。
C语言的源文件分为两种:
1、.c文件,以c为扩展名,一般存储具体功能的实现;
2、.h文件,称为头文件,一般存储类型的定义,函数的声明等。
通常,头文件被.c文件包含,使用#include 语句。
但值得注意的是,这只是一种约定,而非强制。
事实上,将声明写在.c文件,比如a.c,然后
#include "a.c"
同样是合法的。
而把.h文件,内部写入函数实现,再在.c文件中引用,也是编译器允许的。
所以,.c与.h的区分,本质上是一种约定。一名合格的软件开发人员,也要遵循这个约定,增加代码的可读性和维护性。
c文件主要用於写实现.