打印

理不清.c和.h的关系

[复制链接]
4565|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Imakey|  楼主 | 2013-7-30 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我在写模块化程序的时候,尝试用.c和.h来构成头文件的形式,单独或者少量的包含头文件进工程里面是可以通过编译连接的,但是有时候编译器会报错;会提示重复定义变量的错误,或者未解决的外部变量,又或者提示重复定义的public 变量,另一种情况是 ,假如我要用一个一维数组,把它定义成 code 类型也会提示错误,去掉code 关键字它又能编译通过了,这是什么情况???我用的keil4;
我一般是这样定义的  :
///////////////////// a .h
#ifndef _A_H_
#define _A_H_
unsigned char a;
char fun (char x);
#endif

//////////// a.c
#include "a.h"

unsigned char a=10;

char  fun (char x)
{
   return (a*x*x);
}

相关帖子

沙发
minDragon| | 2013-7-30 22:45 | 只看该作者
其实你这个程序是OK的,但还不够完整~完整的模块化,应该是由XXX.h、XXX.c、main.c这三个文件应该在同一个文件夹,
在main.c中#include"XXX.h",以及项目文件里应添加了XXX.h和XXX.c。
可以自己多了解一下头文件。

使用特权

评论回复
板凳
Imakey|  楼主 | 2013-7-30 23:24 | 只看该作者
minDragon 发表于 2013-7-30 22:45
其实你这个程序是OK的,但还不够完整~完整的模块化,应该是由XXX.h、XXX.c、main.c这三个文件应该在同一个 ...

恩恩,可能你理解错了我的意思哈~~我问题的重点是上面的那类错误~~~下面的只是我举的一个简单的例子~~~

使用特权

评论回复
地板
woosoo521| | 2013-7-30 23:51 | 只看该作者
头文件,源程序??

使用特权

评论回复
5
南宫云明| | 2013-7-31 08:14 | 只看该作者
是不是有些地方需要extern来声明呀

使用特权

评论回复
6
jisjkla| | 2013-7-31 08:30 | 只看该作者
我觉得是不是你定义的char a 在别的地方也定义了,用static试试

使用特权

评论回复
7
原野之狼| | 2013-7-31 08:40 | 只看该作者
不要把变量定义放在h文件中

使用特权

评论回复
8
airwill| | 2013-7-31 08:46 | 只看该作者
在头文件中:
变量的声明 用 extern.

而变量的定义尽量放在 .c 文件中

这个问题, 拿 Keil 里的例程, 模仿一下就是了

使用特权

评论回复
9
奋斗人生| | 2013-7-31 09:01 | 只看该作者
一个是库文件,一个是C程序文件,应该不好混淆吧

使用特权

评论回复
10
coody| | 2013-7-31 10:16 | 只看该作者
H文件里不要放程序代码

使用特权

评论回复
11
yewuyi| | 2013-7-31 10:53 | 只看该作者
1、对于C编译器来说,符号声明、变量定义/声明、函数定义/声明等等,不管是在C文件还是H文件中都能正确的被编译器识别和编译。
2、但为了多文件编译时便于阅读和移植,一般规定在H文件声明符号、声明变量/函数等,所有的变量定义和函数定义均放在C文件中。
3、多文件编译时,还建议每个C文件都对应给出一个H文件,在当前C文件中只包含自己的H文件,当前C文件中引用外部变量和函数时,在该C文件对应的H文件中进行外部变量或者外部函数声明。

使用特权

评论回复
12
通宵敲代码| | 2013-7-31 10:54 | 只看该作者
没开发过太大的程序,没经验,学习了。

使用特权

评论回复
13
minDragon| | 2013-7-31 12:52 | 只看该作者
南宫云明 发表于 2013-7-31 08:14
是不是有些地方需要extern来声明呀

11楼正解~在头文件中放的是函数以及变量的声明,而在XXX.C中写代码~
要是在MAIN,C中要使用到的头文件里面声明的变量或函数,
就需要在头文件中用extern来修饰该变量或函数。
若是XXX.c自己内部调用的变量或者函数 应用static修饰~
还是没解决你的问题的话 可以再继续交流交流
还有那个code的地方你是放在哪里呢~如 code unsigned char / unsingned char code
我一直用的是unsingned char code这样的写法。。。除非数组蛮大的 不然不需要用到code吧~

使用特权

评论回复
14
wuyansky| | 2013-7-31 13:01 | 只看该作者
///////////////////// a .h
#ifndef _A_H_
#define _A_H_
extern unsigned char a;    //外部变量要加extern修饰
extern char fun (char x);   //外部函数要加extern修饰
#endif

//////////// a.c
#include "a.h"

  a=10;    //头文件里已经定义过了,这里直接赋值即可。

char  fun (char x)
{
    return (a*x*x);
}

这样试试。

使用特权

评论回复
15
chenbb8| | 2013-7-31 13:06 | 只看该作者
coody 发表于 2013-7-31 10:16
H文件里不要放程序代码

不放代码的的话 就无法使用inline或者#define插入代码了

使用特权

评论回复
16
minDragon| | 2013-7-31 13:16 | 只看该作者
chenbb8 发表于 2013-7-31 13:06
不放代码的的话 就无法使用inline或者#define插入代码了

不是还有嘅与H文件想对应的C文件么~代码放那里就OK了~

使用特权

评论回复
17
logokfu| | 2013-7-31 13:30 | 只看该作者
wuyansky 发表于 2013-7-31 13:01
///////////////////// a .h
#ifndef _A_H_
#define _A_H_

函数声明前面的extern可以省掉。

使用特权

评论回复
18
mcu5i51| | 2013-7-31 14:54 | 只看该作者
14L 只是声明了变量,尚没有定义,目测编译会有问题!
*.h 文件好比一个花名册和简介,带有某人的基本特征描述
一个人可以有多个花名册副本在不同的部门,无论这个部门有没有调用这个人,而这个人却只有一个,在*.c中实现变量定义或函数定义;
C语言书写很宽松,没有有求你要怎么做,习惯是头文件只做声明,C文件实现对应代码和变量,这样便于管理.

使用特权

评论回复
19
refee| | 2013-7-31 15:06 | 只看该作者
建议楼主看看微软的C编程精粹 兴许还有点帮助呢……
https://bbs.21ic.com/icview-465028-1-1.html

使用特权

评论回复
20
chenbb8| | 2013-7-31 15:30 | 只看该作者
minDragon 发表于 2013-7-31 13:16
不是还有嘅与H文件想对应的C文件么~代码放那里就OK了~

自然是想inline函数到很多源文件中才会想到写进头文件中的这种方法的。
宏函数也是类似。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:联系邮箱 997494013@qq.com

76

主题

779

帖子

4

粉丝