再问.c与.h文件间关系以及如何处理

做一个码农都是奢望 2012-07-22 10:14:43
目前系统中有多个自定义的.h文件和.c文件。

如sd.c;sd.h;uart.h等待,
1在main.c以及sd.c都要使用uart.h,如果我仅main.h中#include "uart.h",编译时会提示 sd.c中的"uart.h"被调用函数倍 显示(implicit)申明;如果在sd.h中#include "uart.h",就会报其函数重复定义。

2由于mian.c中的函数过多,想继续将main.c分解,如分解成myfun.c,同样需要调用"uart.h"中函数;如果在myfun.c中#include "uart.h",就会对uart.h中函数报 重复定义的错误。

请问 如何处理.c以及.h文件间的关系?
...全文
575 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
我们的磊生 2012-08-31
  • 打赏
  • 举报
回复
原来还有这么多讲究啊!我一般就一个main.c,什么东西都塞里面!
Ragau 2012-08-31
  • 打赏
  • 举报
回复
.h文件一般要加一个宏,如果你的.h文件的名字是myfun.h,则这样写
#ifndef MYFUN_H_
#define MYFUN_H_

//声明部分

#end if

再建立一个mufun.c的文件对声明的函数进行实现,但要加
#include "myfun.h"

然后就可以在main.c中调用了。这样挺省事的,工整而且简单。
如果有很多的.c文件都用到"filename.h"了就都加头文件可以了。
Frank_163 2012-08-31
  • 打赏
  • 举报
回复
IAR写程序时候,可以有多个.c 但只有一个main函数
BYD123 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 10 楼 的回复:
在uart.h文件中加上一个控制宏


#ifndef __UART_H__
#define __UART_H__
//
//你原来uart.h中的内容
//
#endif

注意:不要在.h文件中定义任何变量,否则会让你很郁闷


使用这个方法,你注意看看系统的头文件或别人写的头文件,都使用的类似这个方法

“显示(implicit……
[/Quote]
+1
songhere 2012-08-28
  • 打赏
  • 举报
回复
关于头文件,一般的c语言入门书籍都一笔带过,对于初学者来说,也不会体会到头文件的好处。要知道头文件的作用还得通过具体编程来看。
xgbing 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
在uart.h文件中加上一个控制宏


#ifndef __UART_H__
#define __UART_H__
//
//你原来uart.h中的内容
//
#endif

注意:不要在.h文件中定义任何变量,否则会让你很郁闷
[/Quote]

使用这个方法,你注意看看系统的头文件或别人写的头文件,都使用的类似这个方法

“显示(implicit)申明”是没有函数原型,需要包含头文件。
“重定义”是因为多次包含了头文件

如果要定义一个变量,使用如下方法:
例如:
a.c

int var; //变量的定义

那么在a.h中:

extern int var; //变量的声明


定义只能出现一次,声明可以多次。

lxglxt 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

.h是声明
.c是实现


LZ先明确这个。。。

另外,还要在语法上明确区分:定义和声明的不同

C里是支持一处定义,多处声明的。

我习惯的做法是:

每一组相关的功能组织到一个C和H文件

然后,整个项目再组织一个整体的H文件,用来处理头文件之间的次序

然后,所有的应用都只包含项目中的那个H文件即可
[/Quote]

我的做法,一个C对应2个H文件。
一个H文件仅供C调用,另一个H专门被其他模块引用,而且内容基本只有函数声明。
H文件的混乱,一般是塞了太多内容造成的!
ymm198606 2012-08-22
  • 打赏
  • 举报
回复
10楼方法OK
Simality 2012-08-22
  • 打赏
  • 举报
回复
10楼正解,另外建议.h与.c成对出现。对于结构体和联合这类复合数据结构要善用typedef。typedef在.h中定义,在.c中声明实际的变量。如果是跨文件使用的变量,要在.c中声明后,在.h中extern一下。
1586874907 2012-08-22
  • 打赏
  • 举报
回复
在uart.h文件中加上一个控制宏


#ifndef __UART_H__
#define __UART_H__
//
//你原来uart.h中的内容
//
#endif

注意:不要在.h文件中定义任何变量,否则会让你很郁闷
fsxtiger 2012-07-23
  • 打赏
  • 举报
回复
文件包含不是一两句能说清楚,随便一本C教材都有与此有关的介绍,看一下就行!
lbing7 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

.h是声明
.c是实现
[/Quote]

LZ先明确这个。。。

另外,还要在语法上明确区分:定义和声明的不同

C里是支持一处定义,多处声明的。

我习惯的做法是:

每一组相关的功能组织到一个C和H文件

然后,整个项目再组织一个整体的H文件,用来处理头文件之间的次序

然后,所有的应用都只包含项目中的那个H文件即可
ymm198606 2012-07-23
  • 打赏
  • 举报
回复
.c为函数具体实现文件;
。h为函数声明文件
  • 打赏
  • 举报
回复
另外:如果我将所有的。c文件做成.h文件,放在 编译器的根目录下,多次包含都没有问题。

[Quote=引用 1 楼 的回复:]

对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
[/Quote]
  • 打赏
  • 举报
回复
谢谢,虽然没有理解。
什么是文件包含?

[Quote=引用 1 楼 的回复:]

对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
[/Quote]
fsxtiger 2012-07-22
  • 打赏
  • 举报
回复
对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
麻子 2012-07-22
  • 打赏
  • 举报
回复
.h是声明
.c是实现

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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