打印

文件中的数组重定义!!!

[复制链接]
2368|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuidi_wangdan|  楼主 | 2013-8-13 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我调用自己做的字库,提示symbol 'HZ_code' has multiple definitions.HZ_code是我自己定义的一个结构体数组,如下:const rom  struct ST_HZ  HZ_code[72],请教我在文件中加入了条件编译#ifndef __FONT_H
#define __FONT_H...................#endif,为什么还提示多次定义呢?请高手指点!!
沙发
弓长月月鸟| | 2013-8-13 09:45 | 只看该作者
你的程序中,主函数是不是也有这个定义呢?主函数中和子c文件中同时定义的话,可能会有这样的提示。建议在主函数中声明 这个结构体来自于外部。不知道能不能帮上忙。说的不对的地方,也请高手指点一下啊

使用特权

评论回复
板凳
shuidi_wangdan|  楼主 | 2013-8-13 10:40 | 只看该作者
弓长月月鸟 发表于 2013-8-13 09:45
你的程序中,主函数是不是也有这个定义呢?主函数中和子c文件中同时定义的话,可能会有这样的提示。建议在 ...

我在显示.C中调用了这个头文件,在main.C中也调用了这个头文件,提示了多次定义,我觉得不应该,应为我是用了条件编译,为什么还出这个问题?

使用特权

评论回复
地板
ayb_ice| | 2013-8-13 11:16 | 只看该作者
多个C文件包含那个头文件当然重定义了,那个定义只能防止以下出错

// main.c

#include "my_header.h"
#include "my_header.h"

使用特权

评论回复
5
shuidi_wangdan|  楼主 | 2013-8-13 11:24 | 只看该作者
ayb_ice 发表于 2013-8-13 11:16
多个C文件包含那个头文件当然重定义了,那个定义只能防止以下出错

// main.c

#ifndef __FONT_H
#define __FONT_H
...................
#endif
我使用了上面的条件编译啊,也就是只编译一次,那为什么还提示重定义?
是这个条件编译我用错了吗?请老师指点!

使用特权

评论回复
6
john_lee| | 2013-8-13 12:07 | 只看该作者
你是两个.c文件,分别编译一次,总共两次,每次都编译了font,得到了两个.o文件,它们都有HZ_code,这两个.o链接到一起时,就发现了两个HZ_code。

使用特权

评论回复
7
弓长月月鸟| | 2013-8-13 13:04 | 只看该作者
我想你在main。c中,设定了一个变量假设是char aaa;你的另一个文件中应该也是用到了这个变量。两者如果都定义成char aaa;的话,编译器会告知你重复定义的。不知道是不是跟楼主的情况一样???

使用特权

评论回复
8
shuidi_wangdan|  楼主 | 2013-8-13 13:07 | 只看该作者
john_lee 发表于 2013-8-13 12:07
你是两个.c文件,分别编译一次,总共两次,每次都编译了font,得到了两个.o文件,它们都有HZ_code,这两个. ...

也就是条件编译没起作用?

使用特权

评论回复
9
shuidi_wangdan|  楼主 | 2013-8-13 13:11 | 只看该作者
弓长月月鸟 发表于 2013-8-13 13:04
我想你在main。c中,设定了一个变量假设是char aaa;你的另一个文件中应该也是用到了这个变量。两者如果都 ...

我是在h文件中定义的,在两个C文件中调用的,所以出现了这种情况,但不知道怎么去解决,还是基础不扎实啊!

使用特权

评论回复
10
弓长月月鸟| | 2013-8-13 14:24 | 只看该作者
你把主程序中变量中改成extern char aaa;试试看怎么样。。。。

使用特权

评论回复
11
bigwuke| | 2013-8-13 15:00 | 只看该作者
shuidi_wangdan 发表于 2013-8-13 13:11
我是在h文件中定义的,在两个C文件中调用的,所以出现了这种情况,但不知道怎么去解决,还是基础不扎实啊 ...

定义放在 c 文件 ,声明放在 h , 要使用的地方包含此 h 文件。
试试!

使用特权

评论回复
12
shuidi_wangdan|  楼主 | 2013-8-13 16:47 | 只看该作者
bigwuke 发表于 2013-8-13 15:00
定义放在 c 文件 ,声明放在 h , 要使用的地方包含此 h 文件。
试试!

请教一下,怎样声明结构体变量?我找了一下,没找到。

使用特权

评论回复
13
shuidi_wangdan|  楼主 | 2013-8-13 16:49 | 只看该作者
弓长月月鸟 发表于 2013-8-13 14:24
你把主程序中变量中改成extern char aaa;试试看怎么样。。。。

使用的是结构体,我不会声明。但是现在在结构体定义的数组前边添加关键字static是可以解决这个问题的。

使用特权

评论回复
14
john_lee| | 2013-8-13 17:41 | 只看该作者
楼主,规则是这样的:
1、每编译一个C文件,就是一个编译过程。
2、宏只能作用于一个编译过程,而不能跨越两个编译过程。

明白了吗?

使用特权

评论回复
15
lelee007| | 2013-8-13 21:55 | 只看该作者
6楼正解啊

变量定义放在头文件中也真是少见,而且你放在头文件中,还让多个c文件都包含定义变量的.h,真是不应该

另外,LZ根本没搞清楚防止头文件重复包含的宏定义如何起作用,仅仅是知道有防止头文件重复包含这么一种操作

使用特权

评论回复
16
shuidi_wangdan|  楼主 | 2013-8-14 16:33 | 只看该作者
john_lee 发表于 2013-8-13 17:41
楼主,规则是这样的:
1、每编译一个C文件,就是一个编译过程。
2、宏只能作用于一个编译过程,而不能跨越 ...

宏只能夸一个吗?可以夸很多个吧,我在网上搜过,应该编译的时候就跳过去了吧(我是这样理解的)。

使用特权

评论回复
17
shuidi_wangdan|  楼主 | 2013-8-14 16:34 | 只看该作者
lelee007 发表于 2013-8-13 21:55
6楼正解啊

变量定义放在头文件中也真是少见,而且你放在头文件中,还让多个c文件都包含定义变量的.h,真是 ...

您可以给讲解一下宏怎样起作用吗?小弟感激不尽!

使用特权

评论回复
18
lelee007| | 2013-8-14 22:40 | 只看该作者
你先弄清楚与编译时宏展开的过程,把这个弄清楚了,你就可以知道为什么你认为本来应该防止重复包含的东东为什么没起到作用了

使用特权

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

本版积分规则

个人签名:奇葩满天下,不分你我他! 奋斗!https://bbs.21ic.com/static/image/smiley/chubby/17.gif[/url]

65

主题

549

帖子

3

粉丝