初学菜鸟提问:.h文件和.c文件之间有哪些联系,哪些是必要的联系?

cnsuyong 2003-04-26 12:48:18
越详细越好。
...全文
236 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnsuyong 2003-05-04
  • 打赏
  • 举报
回复
谢谢诸位,特别是“大骗子”。
maurice1983 2003-05-01
  • 打赏
  • 举报
回复
其实,我觉得.c和.h文件没什么区别,这只是个习惯!
mercury1231 2003-05-01
  • 打赏
  • 举报
回复
借楼主宝地一问,

为什么只#include 一个头文件,就能使用 在c文件里边才具体代码实现了的功能 呢?
99 2003-05-01
  • 打赏
  • 举报
回复
其实都差不多
本无差别的,只是编译器的默认问题
maenxiang 2003-05-01
  • 打赏
  • 举报
回复
将程序分成.h和.c可以有效地避免一些出乎意料为定义或重定的错误(自己认为是定了或没重定义)

我们可以将整个C/C++编译系统处理简单地分为两步:编译、连接

一、编译:
编译.c(.cpp)后生成文件目标,后缀为.o或.obj
在编译.c(.cpp)时单个文件编译的,每个#include语句都会相当于将所引用的文件的代码原封不动的扩展到到#include的位置上来,如:
test.h:
#ifndef _TEST_H_
#define _TEST_H_

int testvar;
void testfunc();

#endif

test.c;
#include "test.h"
#include <stdlib.h>
#include <stdio.h>
void testfunc()
{
puts("test.c");
printf("testvar is %d\n",testvar);
}

此时的test.c就相当于

test.c;
//#include "test.h"
#ifndef _TEST_H_
#define _TEST_H_

int testvar;
void testfunc();

#endif
#include <stdlib.h>
#include <stdio.h>

void testfunc()
{
puts("test.c");
printf("testvar is %d\n",testvar);
}
此时编译test.c就没问题了,不会有为定义之类的错误。

此时生成的test.o文件中就含有了变量testvar和testfunc的具体实现


二、连接:
将.o文件连接成可执行文件
如以上程序还有文件
main.c:
#include <stdlib.h>
#include <stdio.h>
//#include "test.h"
int main(int argc char * * argv)
{
testvar=16;
testfunc();
return 0;
}

显然编译的时候没有发现testvar和testfunc的声明。
需要增加#include "test.h"语句才好使。
编译后生成main.o文件,里面有testvar和testfunc的声明及main的实现部分。

将test.o和main.o连接生成可执行文件。就ok了

如果不是用#include "test.h"而是用#include "test.c"
编译的时候是好使,整个main.c就相当于

#include <stdlib.h>
#include <stdio.h>

#ifndef _TEST_H_
#define _TEST_H_

int testvar;
void testfunc();

#endif
#include <stdlib.h>
#include <stdio.h>

void testfunc()
{
puts("test.c");
printf("testvar is %d\n",testvar);
}

int main(int argc char * * argv)
{
testvar=16;
testfunc();
return 0;
}
编译完了之后生成的main.o文件就含有testvar的声明和testfunc、main的实现部分。是一个比较完整的,可以直接和相关的库连接生成可执行文件。

如果此时再将test.o和main.o连接,则两个.o中都有testfunc的实现部分,造成重定义

大家已经约定好了.h中放声明部分,.c放实现部分。所以一般的C/C++编译系统都不直接编译.h文件,而将所有的.c编译成.o(或.obj等)目标文件,再将所有的目标文件连接成可执行文件。

cnsuyong 2003-05-01
  • 打赏
  • 举报
回复
“五一”假期结束就结贴,欢迎大家继续各抒己见,楼上各位已经让俺有所领悟了,先行谢过。
aiyinsitan 2003-05-01
  • 打赏
  • 举报
回复
根据习惯, .h中一般放一些声明, 内联函数定义
总之, .h中的内容将不会被直接编译.
.c则是.h中声明的定义, 也就是实现文件.
不过只要你喜欢, 你可以不管这些"习惯"
cnsuyong 2003-04-30
  • 打赏
  • 举报
回复
书上讲的都很含糊,只说是头文件,用来向调用者提供各种声明而不提供函数实现等。但书上又说也可以直接#include "somefile.c"来实现代码共享,如此看来,.h文件在某些场合下岂不多余?比如所有调用者和被调用者的所有源代码都是俺自己编写时。
请得道者指点迷津。
mlsmls0129 2003-04-28
  • 打赏
  • 举报
回复
我也是刚学啊,
可以查一下书啊
yxc2008 2003-04-28
  • 打赏
  • 举报
回复
up
hehe214 2003-04-28
  • 打赏
  • 举报
回复
studying...
cnsuyong 2003-04-28
  • 打赏
  • 举报
回复
再等等...
cnsuyong 2003-04-26
  • 打赏
  • 举报
回复
看来.h唯一有意义的地方就在于发布函数库时不必发布源代码,可以这样理解吗?
jomly 2003-04-26
  • 打赏
  • 举报
回复
*.h是程序的头文件,里面放类型声明、函数声明、宏定义等。
*.c放你的函数代码.
maenxiang 2003-04-26
  • 打赏
  • 举报
回复
理论上两者没有区别,既然要分开,那么就是一些认为的约定了。要遵照这个约定。否则写得程序别人看不懂。你非把申明写到.c里。实现写到.h也未尝不可,不过大多编译器都是将你的所有的.c编译成.obj(或.o等)文件。你说你要将某些.h编译成目标文件,也是可以的,你要改他给你自动生成的make文件,不是找别扭。

zhaoao 2003-04-26
  • 打赏
  • 举报
回复
.h文件一般是函数的申明或者全局变量的声明,如果其他.c文件也都用到相同的头文件,
也可以在这里include进来
.c一般是函数的具体定义,就是函数的实现部分
hongyanzaiyun 2003-04-26
  • 打赏
  • 举报
回复
.h是一般作为头文件,你可以用来放一些类型声明,函数声明,常量定义,宏定义等等,发布产品的时候一般也把它给用户看
而.c则一般放你的函数代码,为了保持版权,你就可以把它留着不发布出去
ghtsao 2003-04-26
  • 打赏
  • 举报
回复
什么文件都无所谓,把两个合在一起也可以用。
zzgcxy 2003-04-26
  • 打赏
  • 举报
回复
.h就是一般的函数文件,里面放的就是常用到的函数,你也可以自己建立自己的.h文件,把自己编的常用的函数放在里面,以后就不用重复的编了。
.c是一般的c语言文件,是c语言编译时的文件,是不能少的。
guenxu 2003-04-26
  • 打赏
  • 举报
回复
.h文件是头文件,主要用于类的定义,包括成员变量和成员函数,为外界提供接口。还有宏义 和全局变量的定义。
.cpp文件是实现部分,通过具体的代码来完成.h文件声明的函数的功能。

加载更多回复(4)
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习使用FFmpeg开发视频监控项目,并动手操练。具体内容包括: 一、视频监控的架构和流程二、FFmpeg4.3+SDL2+Qt5开发环境的搭建三、FFmpeg的SDK编程回顾总结并操练四、SDL2.0的编程回顾总结并操练五、颜色空间转换RGB和YUV的原理与实战六、Qt5+FFmpeg本地摄像头采集预览实战七、代码封装:摄像头h264/5编码并存储八、Qt5+FFmpeg单路网络摄像头采集预览九、Qt5+FFmpeg单路网络摄像头采集预览录制会看十、onvif与GB/T-28181的简介  音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?   因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。 所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。   梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。  目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧