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

[复制链接]
2931|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"
 楼主| shuidi_wangdan 发表于 2013-8-13 11:24 | 显示全部楼层
ayb_ice 发表于 2013-8-13 11:16
多个C文件包含那个头文件当然重定义了,那个定义只能防止以下出错

// main.c

#ifndef __FONT_H
#define __FONT_H
...................
#endif
我使用了上面的条件编译啊,也就是只编译一次,那为什么还提示重定义?
是这个条件编译我用错了吗?请老师指点!
john_lee 发表于 2013-8-13 12:07 | 显示全部楼层
你是两个.c文件,分别编译一次,总共两次,每次都编译了font,得到了两个.o文件,它们都有HZ_code,这两个.o链接到一起时,就发现了两个HZ_code。
弓长月月鸟 发表于 2013-8-13 13:04 | 显示全部楼层
我想你在main。c中,设定了一个变量假设是char aaa;你的另一个文件中应该也是用到了这个变量。两者如果都定义成char aaa;的话,编译器会告知你重复定义的。不知道是不是跟楼主的情况一样???
 楼主| shuidi_wangdan 发表于 2013-8-13 13:07 | 显示全部楼层
john_lee 发表于 2013-8-13 12:07
你是两个.c文件,分别编译一次,总共两次,每次都编译了font,得到了两个.o文件,它们都有HZ_code,这两个. ...

也就是条件编译没起作用?
 楼主| shuidi_wangdan 发表于 2013-8-13 13:11 | 显示全部楼层
弓长月月鸟 发表于 2013-8-13 13:04
我想你在main。c中,设定了一个变量假设是char aaa;你的另一个文件中应该也是用到了这个变量。两者如果都 ...

我是在h文件中定义的,在两个C文件中调用的,所以出现了这种情况,但不知道怎么去解决,还是基础不扎实啊!
弓长月月鸟 发表于 2013-8-13 14:24 | 显示全部楼层
你把主程序中变量中改成extern char aaa;试试看怎么样。。。。
bigwuke 发表于 2013-8-13 15:00 | 显示全部楼层
shuidi_wangdan 发表于 2013-8-13 13:11
我是在h文件中定义的,在两个C文件中调用的,所以出现了这种情况,但不知道怎么去解决,还是基础不扎实啊 ...

定义放在 c 文件 ,声明放在 h , 要使用的地方包含此 h 文件。
试试!
 楼主| shuidi_wangdan 发表于 2013-8-13 16:47 | 显示全部楼层
bigwuke 发表于 2013-8-13 15:00
定义放在 c 文件 ,声明放在 h , 要使用的地方包含此 h 文件。
试试!

请教一下,怎样声明结构体变量?我找了一下,没找到。
 楼主| shuidi_wangdan 发表于 2013-8-13 16:49 | 显示全部楼层
弓长月月鸟 发表于 2013-8-13 14:24
你把主程序中变量中改成extern char aaa;试试看怎么样。。。。

使用的是结构体,我不会声明。但是现在在结构体定义的数组前边添加关键字static是可以解决这个问题的。
john_lee 发表于 2013-8-13 17:41 | 显示全部楼层
楼主,规则是这样的:
1、每编译一个C文件,就是一个编译过程。
2、宏只能作用于一个编译过程,而不能跨越两个编译过程。

明白了吗?
lelee007 发表于 2013-8-13 21:55 | 显示全部楼层
6楼正解啊

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

另外,LZ根本没搞清楚防止头文件重复包含的宏定义如何起作用,仅仅是知道有防止头文件重复包含这么一种操作
 楼主| shuidi_wangdan 发表于 2013-8-14 16:33 | 显示全部楼层
john_lee 发表于 2013-8-13 17:41
楼主,规则是这样的:
1、每编译一个C文件,就是一个编译过程。
2、宏只能作用于一个编译过程,而不能跨越 ...

宏只能夸一个吗?可以夸很多个吧,我在网上搜过,应该编译的时候就跳过去了吧(我是这样理解的)。
 楼主| shuidi_wangdan 发表于 2013-8-14 16:34 | 显示全部楼层
lelee007 发表于 2013-8-13 21:55
6楼正解啊

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

您可以给讲解一下宏怎样起作用吗?小弟感激不尽!
lelee007 发表于 2013-8-14 22:40 | 显示全部楼层
你先弄清楚与编译时宏展开的过程,把这个弄清楚了,你就可以知道为什么你认为本来应该防止重复包含的东东为什么没起到作用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

65

主题

549

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部