c与h的区别

  • 格式:doc
  • 大小:41.50 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一个简单的问题:.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文件,发现第一句