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

[复制链接]
查看11 | 回复8 | 2021-1-27 07:17:19 | 显示全部楼层 |阅读模式
目前系统中有多个自定义的.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文件间的关系?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
谢谢,虽然没有理解。
什么是文件包含?
引用1楼的回复:对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
另外:如果我将所有的。c文件做成.h文件,放在编译器的根目录下,多次包含都没有问题。
引用1楼的回复:对于有多个源文件的程序,都是在.c文件中定义你要用的函数,在.h文件中声明对应.c文件中定义的函数,然后将他们放到你的程序目录中,编写程序时只需“#include“.h””即可,因为编译系统会自动根据声明去目录中查询的。你所说的第二种情况,是因为你使用的方法是文件包含,建议你看看C教材上有关的章节。在文件包含时,.c和.h文件没什么区别,你是怎么定义的就怎么用。
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
.h是声明
.c是实现
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
引用5楼的回复:.h是声明
.c是实现

LZ先明确这个。。。
另外,还要在语法上明确区分:定义和声明的不同
C里是支持一处定义,多处声明的。
我习惯的做法是:
每一组相关的功能组织到一个C和H文件
然后,整个项目再组织一个整体的H文件,用来处理头文件之间的次序
然后,所有的应用都只包含项目中的那个H文件即可
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
文件包含不是一两句能说清楚,随便一本C教材都有与此有关的介绍,看一下就行!
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
.c为函数具体实现文件;
。h为函数声明文件
回复

使用道具 举报

千问 | 2021-1-27 07:17:19 | 显示全部楼层
在uart.h文件中加上一个控制宏

#ifndef__UART_H__
#define__UART_H__
//
//你原来uart.h中的内容
//
#endif
注意:不要在.h文件中定义任何变量,否则会让你很郁闷
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行