4811|13

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Keil C的全局变量问题 [复制链接]

我在ram.c中定义了需要的全局变量
#define uchar unsigned char
uchar counter3;
uchar scounter;
uchar  mcounter;
uchar scounter1;
uchar code Ht1621Tab[]=
{
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar code TAB[]=
{
        0x0b,0x0e,           //0
        0x00,0x06,           //1
        0x07,0x0c,           //2
        0x05,0x0e,           //3
        0x0c,0x06,           //4
        0x0d,0x0a,           //5
        0x0f,0x0a,     //6
        0x00,0x0e,           //7
        0x0f,0x0e,           //8
        0x0d,0x0e,    //9
        0x00,0x00,
        0x0b,0x0e,           //0
        0x00,0x06,           //1
        0x07,0x0c,           //2
        0x05,0x0e,           //3
        0x0c,0x06,           //4
        0x0d,0x0a,           //5
        0x0f,0x0a,     //6
        0x00,0x0e,           //7
        0x0f,0x0e,           //8
        0x0d,0x0e,    //9
        0x0e,0x0e,        //A
        0x0f,0x02,        //b
        0x07,0x00,        //c
        0x07,0x06,        //d
        0x0f,0x08,        //E
        0x0e,0x08,        //F
        0x07,0x08,        //C
        0x0b,0x00,        //L
};

但文件组中除了main.c外,还有其他文件需要这些变量或TAB,可在其他文件中加#include "ram.c"时,就会出现MULTIPLE PUBLIC DEFINITIONS,这些变量到底该怎么定义才能让多个文件都能用?

最新回复

小程序写成大程序,拆开来怎么都不对,正苦恼呢! 多谢各位指点了!  详情 回复 发表于 2009-5-15 09:24
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你用#include "ram.c"当然出现重复定义了,在需要用到这个变量的那个源文件里用extern声明就可以了,不要包含进去。
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在一个工程里面的话,用头文件来定义,在头文件前加判断。
#ifndef __RAM_H__
#define __RAM_H__

#define uchar unsigned char
uchar counter3;
uchar scounter;
uchar  mcounter;
uchar scounter1;
uchar code Ht1621Tab[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar code TAB[]=
{
0x0b,0x0e,   //0
0x00,0x06,   //1
0x07,0x0c,   //2
0x05,0x0e,   //3
0x0c,0x06,   //4
0x0d,0x0a,   //5
0x0f,0x0a,    //6
0x00,0x0e,   //7
0x0f,0x0e,   //8
0x0d,0x0e,    //9
0x00,0x00,
0x0b,0x0e,   //0
0x00,0x06,   //1
0x07,0x0c,   //2
0x05,0x0e,   //3
0x0c,0x06,   //4
0x0d,0x0a,   //5
0x0f,0x0a,    //6
0x00,0x0e,   //7
0x0f,0x0e,   //8
0x0d,0x0e,    //9
0x0e,0x0e, //A
0x0f,0x02, //b
0x07,0x00, //c
0x07,0x06, //d
0x0f,0x08, //E
0x0e,0x08, //F
0x07,0x08, //C
0x0b,0x00, //L
};
#endif


在其他.c文件里面加include ram.h就好了。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
加个ram.h,在这个头文件里只声明不定义,如:

extern uchar counter3;
.....

然后
#include "ram.h"



晕......#include "ram.c"!!!!!!还是建议先看看c的基础书哟.....


还有2楼的,在头文件里定义,如果多次引用此头文件,还是会产生重复定义的。。。

变量有内部链接、外部链接、文件作用域、代码作用域。。。挺复杂的
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
变量定义的实体放在*.c的文件里,在*.h的文件里使用extern uchar counter3; 在其他.c的文件里要用该变量只要包含这个头文件就可以了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 jankereeworld 的回复:
还有2楼的,在头文件里定义,如果多次引用此头文件,还是会产生重复定义的。。。

变量有内部链接、外部链接、文件作用域、代码作用域。。。挺复杂的

看好了。
#ifndef __RAM_H__
#define __RAM_H__
。。。。
#endif
!!!引用此头文件在多次也没有关系。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
呵,我的意思没说清楚,一般多文件结构可能这样吧:

public.h文件:

#ifndef public_H_
#define public_H_

int repeatVar=0;

#endif
------------------------------------------
另个文件:Untitled.h文件:

#ifndef Untitled_H_
#define Untitled_H_

#include "public.h"

#endif
------------------------------------------
主文件:main.h

#ifndef main_H_
#define main_H_

#include "public.h"
#include "Untitled.h"

#endif

这种结构很常见吧,这就是重复定义啦

所以,不管是经典的还是普通的,就是一条规矩:不要在头文件里定义变量,局部变量也不要。


因此,我们可以这样:
public.h文件里声明:

#ifndef public_H_
#define public_H_

extern int repeatVar;

#endif

public.c文件里定义:

#include "public.h"

int repeatVar=0;

。。。。。。。。。。。。。。。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
这里面学问还挺多的,以前写小程序都是一个文件写到底,现在大了不得不得分开了
谢谢大家了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
来学习的
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 2 楼 azmao 的回复:
在一个工程里面的话,用头文件来定义,在头文件前加判断。
#ifndef __RAM_H__
#define __RAM_H__

#define uchar unsigned char
uchar counter3;
uchar scounter;
uchar  mcounter;
uchar scounter1;
uchar code Ht1621Tab[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar code TAB[]=
{
0x0b,0x0e,  //0
0x00,0x06,  //1
0x07,0x0c,  //2


这个有问题,Ht1621Tab[],TAB[]在main.c中#include "ram.h"总提示出错
ERROR L104: MULTIPLE PUBLIC DEFINITIONS
            SYMBOL:  TAB
            MODULE:  MAIN.OBJ (MAIN)
ERROR L104: MULTIPLE PUBLIC DEFINITIONS
            SYMBOL:  HT1621TAB
            MODULE:  MAIN.OBJ (MAIN)
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 wangfan027 的回复:
引用 2 楼 azmao 的回复:
在一个工程里面的话,用头文件来定义,在头文件前加判断。
#ifndef __RAM_H__
#define __RAM_H__

#define uchar unsigned char
uchar counter3;
uchar scounter;
uc

不要在.h里定义变量。
得用extern Ht1621Tab;
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
同意楼上仙人们说的:

定义和声明要明确分开

只可一处定义,处处声明者没有问题

只要你觉得有必要性
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
小程序写成大程序,拆开来怎么都不对,正苦恼呢!
多谢各位指点了!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表