论坛风格切换切换到宽版
  • 4148阅读
  • 14回复

用KEIL C的朋友青筋! [复制链接]

上一主题 下一主题
离线永远的FM
 
发帖
11512
只看楼主 倒序阅读 0楼 发表于: 2010-08-31
在keil c中编译工程。要设置几个变量能在多个文件里调用的(公共变量),请问这种变量怎么定义?
现在每个编译的文件都包含了一个叫abc.h的头文件。
尝试在头文件里用普通方法定义变量,编译时提示找不到变量。
在变量前面加入 extern标识,也不行。
请大伙支招~
离线xiaomu
发帖
178
只看该作者 1楼 发表于: 2010-08-31
要不把公共变量定义放在一个文件里,在其他文件开头处 用extern +变量名
试下,偶的c也不好,这里提得只是偶自己拍脑袋想的办法,看看行不呵呵,随后会继续关注本贴:)
离线bd1es
发帖
2096
只看该作者 2楼 发表于: 2010-09-01
这样呗。先写一个.c,比如:
/* a.c */
int mmnn = 2010;

再来个.h,比如:
/* a.h */
extern int mmnn;

使用的时候这样干:
/* main.c */
#include "a.h"

int main() {
int oopp = mmnn * 3108;
do_things_i_like ...
return 0;
}

当然如果定义常数的话,在.h中定义宏就可以了。上面定义的是个全局变量,真正开了存储空间的。:)
离线xiaomu
发帖
178
只看该作者 3楼 发表于: 2010-09-01
不能在每个文件里都包含了一个叫abc.h的头文件,这样是不行的,编译器会报错:重复定义
;你把公共变量放在头文件里:
/* a.c */
extren int mmnn = 2010;

再来个.h,比如:
/* a.h */
int mmnn;
/* main.c */
#include "a.h"

int main() {
int oopp = mmnn * 3108;
do_things_i_like ...
return 0;
}
离线BA5RW
发帖
48255
只看该作者 4楼 发表于: 2010-09-01
全局变量吧?
离线永远的FM
发帖
11512
只看该作者 5楼 发表于: 2010-09-01
是的。全局变量
想起来了,要先在头文件里用extern前缀声明一下全局变量名称和性质
然后在其他c文件里给变量赋值或使用。
离线xiaomu
发帖
178
只看该作者 6楼 发表于: 2010-09-01
to永远的fm
我的看法:没有必要每个编译的文件都包含abc.h文件,应用#include “文件名”较简便,如
/* a.h */
int mmnn;
/* a. c*/
extern mmnn = 2010;

/* main.c */
#include "a.h"
#include "a.c" /*#include "a.h" 在前,顺序不能错*/
int main() {
int oopp = mmnn * 3108;
do_things_i_like ...
return 0;
}
/*这样可以吧,呵呵各位兄台给出意见*/
离线bd1es
发帖
2096
只看该作者 7楼 发表于: 2010-09-02
俺发现俺的法子能用,
离线xiaomu
发帖
178
只看该作者 8楼 发表于: 2010-09-03
to bd1es
当然可以用了;
.h .c 文件后缀不一样,但对于#include来说区别不大,
这样用也没问题。(不过这里也学习了呵呵,偶也姓穆,我们本家啊;这里再联系下哈哈)
/* a.h */
int mmnn;
/* a. c*/
extern mmnn = 2010;
/* main.c */
#include "a.c"
int main() {
int oopp = mmnn * 3108;
do_things_i_like ...
return 0;
}
离线bd1es
发帖
2096
只看该作者 9楼 发表于: 2010-09-04
哈哈我也注意到了,似乎整个坛子上穆姓就只有我们两个人,

说说程序。楼主的要求是构造一个公用数据域,供多个模块共享。所以如果分别嵌入.c就不灵,因为不同模块内的mmnn相互独立,它们之间不能互通了。

当然公共数据域还是尽量回避为好。尽管这些年随着oo方法论的普及,共享数据的管理问题已经不那么难办了,但单片机有很多资源约束,传统方法有时还得用(比如与中断例程通信或多线程同步等),只要注意避开副作用就行了。

出故事了。俺发这个帖子之后,发帖累计数变成了2011,跟图片上mmnn的初值不相等了, :d
离线永远的FM
发帖
11512
只看该作者 10楼 发表于: 2010-09-14
杯具!按照4楼和8楼热心朋友方法定义全局变量,环境mdk3.50,结果编译失败,在main.c里提示变量没有声明类型(变量没有定义)。不知怎么做了。
右边绿色箭头所指即为错误位置
离线xiaomu
发帖
178
只看该作者 11楼 发表于: 2010-09-15
在main 中uint16_t bk_value =120;
try下,
另外我提的办法如何,fm兄,今天累了,就写到这。
离线bd1es
发帖
2096
只看该作者 12楼 发表于: 2010-09-22
[quote=永远的fm]杯具!按照4楼和8楼热心朋友方法定义全局变量,环境mdk3.50,结果编译失败,在main.c里提示变量没有声明类型(变量没有定义)。不知怎么做了。
右边绿色箭头所指即为错误位置[/quote]

俄?必须在某个程序中保存bk_value的存储实体,除了嵌入那个变量的外部类型声明之外。

比如:

storage.c
uint16_t bk_value;

user.c
extern uint16_t bk_value;
bk_value=2012;

好像是poweravr的开发板
离线永远的FM
发帖
11512
只看该作者 13楼 发表于: 2010-09-24
非常感谢楼上穆老师和mu朋友的解答。那个问题一直没搞明白咋回事,我用其他方法代替那个全局变量,也实现了自己需要的功能。以后会有时间想办法解决这个问题的。
离线xiaomu
发帖
178
只看该作者 14楼 发表于: 2010-09-25
本人姓穆:)