c与h的区别
- 格式:doc
- 大小:41.50 KB
- 文档页数:10
一个简单的问题:.c和.h文件的区别
学了几个月的C语言,反而觉得越来越不懂了。同样是子程序,可以定义在.c 文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢?
2楼:
子程序不要定义在.h中。
函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误。
3楼:
.h只做声明,编译后不产生代码
4楼:
这样做目的是为了实现软件的模块化
使软件结构清晰,而且也便于别人使用你写的程序
纯粹用 C 语言语法的角度,你当然可以在 .h 中放任何东西,因为 #include 完全等价于把 .h 文件 Ctrl-C Ctrl-V 到 .c 中
.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能干什么、该怎么用”
.c 中是所有变量和函数的定义,告诉计算机你的程序“该怎么实现”
5楼:
当然,如果一个 .h 被多个 .c 包含
而且 .h 中有对象(变量或函数)的定义,就会发生重复定义的错误了
声明可以无穷多次,定义只能一次
6楼:
一般来说,一个C文件应该是一个模块
如果你的程序仅仅有一个模块(仅仅一个C文件),就可以不用建立H文件了。
否则你的模块肯定不是独立的,你的模块里面的实现要被别的模块调用。这个时候你最好生成一个头文件(H文件),在头文件里面可以声明你的那些函数是公共的。当别的模块包含你的头文件后,就可以使用你的公共声明了。
7楼:
一个C对应一个H,这样管理起来方便
比如你有一个"feed_dog.c",那么就再添加一个"feed_dog.h":
#ifndef _feed_dog_h
#define _feed_dog_h
extern void feed_dog(void);
#endif
其实在H文件里写函数也无所谓,只是不符合习惯而已。只要按照以上的格式写,一个H文件添加多少次都无所谓,呵呵
8楼:
只是一种约定
在编译器里面,.c和.h是没有区别的,.c和.h如何使用完全取决于程序员,不过为了你的程序以后还能看懂而且别人也能看懂,请遵守普遍的约定,这些约定前面的大虾们已经讲了很多了.
这个就象汽车在马路上要靠右行使一样,是人为约定,汽车(编译器)本身并不知道自己是在靠左还是靠右行使.
如果你喜欢,还可以用任意后缀命名源文件和头文件,但这样干可能会导致集成编译和调试环境罢工,你只好自己写makefile文件了.
9楼:
非常感谢各位大侠,不过我现在越来越糊涂了
1,当一个函数要经常使用(比如有十几个C文件使用它)时,一般我都放在H文件里,并在前面加上__inline.对于__inline函数,很多C文件都可以INCLUDE 这个H文件,但是它好象只能被一个H文件INCLUDE,如果有两个H文件INCLUDE 它,就会出现编译错误。
2,有些数组变量,其大小可能达十几K,而且要赋初值,这就不放在C文件里了,要不人都蒙了。
3,
#ifndef _feed_dog_h
#define _feed_dog_h
extern void feed_dog(void);
#endif
mohanwei兄,是不是这样定议了,这个feed_dog.h就可以无数次的被INCLUDE 了?
11楼:
#ifndef _feed_dog_h //如果到目前为止还没有定义过“_feed_dog_h”这个宏#define _feed_dog_h //则定义“_feed_dog_h”这个宏
extern void feed_dog(void); //声明一个外部函数
#endif //“#ifndef”到此结束
所以,不管你定义多少次(哪怕你在同一个C文件里定义多次),都不会发生冲突的。
在网上看到一篇关于.H和.C的文章,感觉不错,帖出与大家共享.
简单的说
其实要理解C文件与头文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:
1.预处理阶段
2.词法与语法分析阶段
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制
码,也就是去掉了文件格式信息.
编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位
,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器
的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!!
有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main
函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:
#include
#include "mytest.h"
int main(int argc,char **argv)
{
test = 25;
printf("test.................%d\n",test);
}
头文件内容如下:
int test;
现在以这个例子来讲解编译器的工作:
1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句