打印
[C语言]

头文件重定义的问题

[复制链接]
1170|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nightingale2003|  楼主 | 2015-2-7 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nightingale2003 于 2015-2-8 23:23 编辑

汗,之前打了内容放在记事本上的,结果前面的没复制到,我补充上吧。
背景(无关紧要):
这两天在弄TFT,在把字库编码放到头文件时发生了 数组被重定义的问题。
为了让提问简洁明了点,以下把数组和结构体替换成单个变量进行说明哈,
顺便无关的文件也不在此说明了。

正题:
文件中有main.c  ILI9325.c  ILI9325.h  temp.h(内容换成如下)
#ifndef temp_H
#define temp_H
const float pi=3.14;
#endif

如果把temp.h单单放在一个C文件里,就没问题。
但当放在
1.  ILI9325.h中
2.   main.c和ILI9325.c中
就会提示float重定义

四处找资料了解到,在头文件中用const初始化变量或数组之类的,相当于定性将该变量或数组为内部(应该是局部变量的意思吧)。不过这个只适用于C++,不是在C语言。
根据这点,我试了下加上static,问题解决。

虽然问题解决了,不过看到过别人一些程序,是没加static的,
所以很想请教下各位大大,有没有方法在不用static的情况下,也能解决重定义的方法呢?

相关帖子

沙发
as564335sa| | 2015-2-8 00:52 | 只看该作者
楼主不知道#ifndef  _XX_H
#define _XX_H
................
#endif
这东西吗

使用特权

评论回复
板凳
mazhao141| | 2015-2-8 08:28 | 只看该作者
你加上static 你的变量可能就不是以前的那个变量了。你要明白对于变量,定义和声明是两回事。

使用特权

评论回复
地板
nightingale2003|  楼主 | 2015-2-8 20:31 | 只看该作者
as564335sa 发表于 2015-2-8 00:52
楼主不知道#ifndef  _XX_H
#define _XX_H
................

之前发的时候没发现前面一段没复制,结果主题贴没头,没说清除,汗。
回正题,#ifndef XX_H这个是有加的,不过还是会报错

使用特权

评论回复
5
nightingale2003|  楼主 | 2015-2-8 20:34 | 只看该作者
mazhao141 发表于 2015-2-8 08:28
你加上static 你的变量可能就不是以前的那个变量了。你要明白对于变量,定义和声明是两回事。 ...

我的变量是图片的代码,打算放在flash里的,所以不需要修改
在C51中是用code的,不过发现MDK中code不是关键字,取而代之的是const

使用特权

评论回复
6
mazhao141| | 2015-2-8 20:44 | 只看该作者
nightingale2003 发表于 2015-2-8 20:34
我的变量是图片的代码,打算放在flash里的,所以不需要修改
在C51中是用code的,不过发现MDK中code不是关 ...

变量的作用域可能比你想的还要复杂。static对全局变量的声明会导致这个变量对其他文件隐藏。对于单个常量,可以定义宏常量

使用特权

评论回复
7
xyz549040622| | 2015-2-8 20:48 | 只看该作者
造成重定义的原因很多,楼主需要具体给出你的变量是如何定义和使用的说明。通常一个变量需要全局使用,那么在.c文件中定义,.h文件中申明。其他需要使用这个变量的.c文件中,包含这个定义的.h文件即可。

使用特权

评论回复
8
coody| | 2015-2-8 20:48 | 只看该作者
用条件编译防止重复包含。

使用特权

评论回复
9
nightingale2003|  楼主 | 2015-2-8 23:32 | 只看该作者
mazhao141 发表于 2015-2-8 20:44
变量的作用域可能比你想的还要复杂。static对全局变量的声明会导致这个变量对其他文件隐藏。对于单个常量 ...

嗯,我对于static确实也不想用。
因为想用的不是单个变量,而是数组 和一个结构体数组,所以没法宏定义。
目前的解决办法就是版主说的,把数组在C文件里定义,再在头文件中声明。

使用特权

评论回复
10
nightingale2003|  楼主 | 2015-2-8 23:43 | 只看该作者
xyz549040622 发表于 2015-2-8 20:48
造成重定义的原因很多,楼主需要具体给出你的变量是如何定义和使用的说明。通常一个变量需要全局使用,那么 ...

感谢指导,目前按BZ方法实行。我定义的数组和结构体数组是用于存放ASCII码和汉字GBK码的,不过这样除了h文件,还多建立了一个c文件。不知有没有方法能把这些东东放到h文件里。

以下是我头文件想包含的内容
u8 const ascii[][16]={
/*--  文字:  !  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,
//其他的省略
}

typedef struct                 // 汉字字模数据结构
{
        char GBK_code[2];              // 汉字内码索引
        u8 Msk[72];                      // 点阵码数据
}GB24;

GB24 const Character24[] =        // 数据表
{
        0xb5,0xa5,//“单”  GBK码
             0x04,0x00,0x80,0x03,0x00,0xE0,0x01,0x81,
      0x80,0x01,0xC3,0x00,0x00,0x86,0x00,0x0F,
      0xFF,0xF0,0x0C,0x18,0x38,0x0C,0x18,0x30,
      0x0F,0xFF,0xF0,0x0C,0x18,0x30,0x0C,0x18,
      0x30,0x0C,0x18,0x30,0x0F,0xFF,0xF0,0x0C,
      0x18,0x30,0x08,0x18,0x20,0x00,0x18,0x0C,
      0x7F,0xFF,0xFE,0x00,0x18,0x00,0x00,0x18,
      0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,
      0x18,0x00,0x00,0x18,0x00,0x00,0x10,0x00,
//其他字这里省略
}

使用特权

评论回复
11
nightingale2003|  楼主 | 2015-2-8 23:44 | 只看该作者
xyz549040622 发表于 2015-2-8 20:48
造成重定义的原因很多,楼主需要具体给出你的变量是如何定义和使用的说明。通常一个变量需要全局使用,那么 ...

感谢指导,目前按BZ方法实行。我定义的数组和结构体数组是用于存放ASCII码和汉字GBK码的,不过这样除了h文件,还多建立了一个c文件。不知有没有方法能把这些东东放到h文件里。

以下是我头文件想包含的内容
u8 const ascii[][16]={
/*--  文字:  !  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00,
//其他的省略
}

typedef struct                 // 汉字字模数据结构
{
        char GBK_code[2];              // 汉字内码索引
        u8 Msk[72];                      // 点阵码数据
}GB24;

GB24 const Character24[] =        // 数据表
{
        0xb5,0xa5,//“单”  GBK码
             0x04,0x00,0x80,0x03,0x00,0xE0,0x01,0x81,
//剩下编码这里省略
}

使用特权

评论回复
12
xyz549040622| | 2015-2-9 08:45 | 只看该作者
nightingale2003 发表于 2015-2-8 23:44
感谢指导,目前按BZ方法实行。我定义的数组和结构体数组是用于存放ASCII码和汉字GBK码的,不过这样除了h ...

把.c文件和.h文件分开,个人认为是个很好的习惯。把定义放在.h文件中,如果这些定义不使用的话,就会占用内存空间的吧。或许你可以降低编译器的报警等级为0试试。

使用特权

评论回复
13
mazhao141| | 2015-2-9 09:52 | 只看该作者
nightingale2003 发表于 2015-2-8 23:43
感谢指导,目前按BZ方法实行。我定义的数组和结构体数组是用于存放ASCII码和汉字GBK码的,不过这样除了h ...

不用,你可以把数组定义在.h里。比如你定义const int a[2] = {0 , 0}
引用的时候 在需要引用的地方声明 extern const int a[2] 你甚至可以在函数体里这么做。

使用特权

评论回复
14
nightingale2003|  楼主 | 2015-2-9 20:23 | 只看该作者
今天发现用static,引用头文件越多,需要分配的内存越多。必须放弃。
目前的结论,如果多个C文件需要使用引用到这些const变量,就老老实实建立一个C用于存放这些内容,然后H文件里声明;
如果只是两三个C要引用,就放在H文件里,在第二第三个C里声明。

结贴,再次感谢各位帮忙解答

使用特权

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

本版积分规则

31

主题

105

帖子

2

粉丝