搜索
bottom↓
回复: 23

全局变量怎么才能在其它模块(主程序,子程序,子函数)中共用?

[复制链接]

出0入0汤圆

发表于 2008-6-22 08:54:35 | 显示全部楼层 |阅读模式
在CCS2.20中:
main.c:
#include "F2407REGS_c.h"
main()
{   
        unsigned int jishu;
        //DSP2407_Initializing();                 // DSP2407芯片初始化
        SystemInit();                         //系统初始化       
        //IOPort_Initializing();                 // 数字IO端口初始化       
        //Timer1_Initializing();                // 定时器1初始化

          yanshihanshu( );

          asm(" CLRC INTM");                        // 允许总中断
        while(1)                            // 主循环,可分配非实时性任务
        {
        }                                                                                                                                         
}

在子函数:

yanshi.h:
int aa;
void yanshihanshu( );

#include  "yanshi.h"
void yanshihanshu( )
{
for(aa=0;aa<5;++aa);
}

我希望子函数void yanshihanshu( )中的变量aa在主程序main.c 中共用,按理说我上面的定义aa已经是全局变量,在ccs2.20中编译出现错误:"main.c", line 25: [F108] 'aa' undefined ,为什么不行?怎么才行?谢谢!

出0入0汤圆

 楼主| 发表于 2008-6-22 09:38:50 | 显示全部楼层
谢谢cocalli, 除了在主函数要定义外部变量:extern int aa外,我在子函数需要用此变量aa时,在子函数中还需要定义int aa,否则还是报错没有定义,这种用法应该不对哟。

出0入54汤圆

发表于 2008-6-22 09:45:10 | 显示全部楼层
yanshi.h:
int aa;
void yanshihanshu( );

int aa前加extern
把int a放到某一个C文件。

出0入0汤圆

 楼主| 发表于 2008-6-22 10:02:23 | 显示全部楼层
感谢lusson !我做了实验,还是不行,并且你把它放到C文件里,不就成了局部变量吗?

出0入22汤圆

发表于 2008-6-22 10:10:36 | 显示全部楼层
4楼,是放在c文件内所有函数的开头。

出0入54汤圆

发表于 2008-6-22 10:11:15 | 显示全部楼层
那你去看看C语言的书
看看对全局变量的定义吧。

出0入0汤圆

 楼主| 发表于 2008-6-22 10:56:57 | 显示全部楼层
感谢大家的指教,这么一个问题,我也翻了书。

main.c:
#include "F2407REGS_c.h"
extern int aa;//放在c文件内函数的开头
main()
{   
        //DSP2407_Initializing();                 // DSP2407芯片初始化
        SystemInit();                         //系统初始化         
        //IOPort_Initializing();                 // 数字IO端口初始化         
        //Timer1_Initializing();                // 定时器1初始化

          yanshihanshu( );

          asm(" CLRC INTM");                        // 允许总中断
        while(1)                            // 主循环,可分配非实时性任务
        {
        }                                                                                                                                          
}

在子函数:

yanshi.h:
void yanshihanshu( );

#include  "yanshi.h"  
void yanshihanshu( )
{
for(aa=0;aa<5;++aa);
}

应该是这样吧,在ccs2.20中编译还是会出现错误void yanshihanshu( )的aa没有定义,不知错误在哪里,这个时候在yanshi.h还要定义吗,定义了那当然不会报错。但是在AVR GCC里好象不是这样。

出0入0汤圆

发表于 2008-6-22 11:04:21 | 显示全部楼层
yanshi.h:

#ifndef YANSHI_H
#define YANSHI_H
extern int aa;
void yanshihanshu();
#endif
+------------------
yanshi.c:

#include  "yanshi.h"  
int aa;
void yanshihanshu( )  
{  
for(aa=0;aa<5;++aa);  
}
+-----------------
main.c:  
#include "F2407REGS_c.h"  
#include  "yanshi.h"
main()  
{
}
--------------

出0入0汤圆

 楼主| 发表于 2008-6-22 11:21:31 | 显示全部楼层
请教mljda:这里yanshi.c 中的int aa; 还必须定义吗?定义了那当然不会报错。我看书上也是这么讲的,这样就保证了main.c 和yanshi.c中的aa分配的同一个内存。谢谢!

+------------------
yanshi.c:

#include  "yanshi.h"   
int aa;  
void yanshihanshu( )   
{   
for(aa=0;aa<5;++aa);   
}
+-----------------

出0入54汤圆

发表于 2008-6-22 12:23:01 | 显示全部楼层
你去看看extern关键字的解释。

出0入0汤圆

 楼主| 发表于 2008-6-22 13:10:55 | 显示全部楼层
感谢!明白了。

c语言关键字之 extern

extern可以修饰变量和函数,表示该变量或者函数在其它地方被定义(本源文件或其它源文件内,见注[1]),在这里声明使用它,这样多个源文件共享变量和函数;多个c源文件的编译是独立的,所以编译器无法判断多个源文件共享的变量的类型是否一致(只判断变量名或函数名是否一致);


等到链接的时候(这个阶段已经不再进行语法检查了),多个源文件编译后的.o文件链接成一个目标文件,如果有一个以上源文件对同一个变量进行了初始化,则报错。[至少gcc编译器是这样的]


注[1]:extern声明的变量可以在本源文件也可以在其它源文件出现过;在其它源文件出现过的情况就不说了;那么本源文件出现的情况,考虑在一个.h中声明了一个变量a,而在包含了该.h的.c中定义了a,这种情况大量出现,比如c标准库中的ctype.h和ctype.c,在ctype.h中声明了extern char _ctmp,在ctype.c包含ctype.h且定义了char _ctmp,那么在预处理后就出现同一源文件中一个定义多个声明的情况


(1) extern 变量名
在任何函数体外声明或定义变量时,不加extern可能是定义也可能是声明,编译器选择初始化的那个(最多一个地方对他进行了初始化),如果没有初始化则任选其中一个作为定义,其他为声明,但是加extern肯定是声明; 如果不想让其它源文件链接到,则需要使用static关键字;

在函数体内声明(注意是声明,在函数体内部不能定义外部变量)使用其他源文件中定义的变量时,必须使用extern关键字,因为在函数体内默认为局部变量。

(2) extern 函数
函数默认是外部的(在函数体内或函数体外声明一个外部函数,extern关键字均可省略),如果不想让其它源文件链接到,在函数前static关键字
注:虽然在很多情况下extern关键字是可省的,但是为了提高程序的可读性,还是加上它比较好.

前面提到过,编译器并不检查多个源文件共享的变量的类型是否一致,那么下面的代码是合法的

/*x.c*/
char a[]="hello";
/*y.c*/
int main(){
    extern int a;  /*或者extern a;*/
    printf("%x\n",a);
    return 0;
}


同样,多个源文件共享函数,编译器也不会对外部函数的参数类型和参数个数及返回值类型进行检查,只要函数名相同即可(就是说在用extern声明变量时,可以不指定类型)。

/*x.c*/
int echo(int x){
    return x;
}
/*y.c*/
int main(){
    extern int echo(char);
    printf("%d\n",echo(255));
    return 0;
}

注意输出值

所以在写程序时,一定要注意外部函数的参数类型和参数个数及返回值类型,最好保持一致,要不然会出现意想不到的问题。

出0入0汤圆

发表于 2011-8-15 09:28:23 | 显示全部楼层
终于搞懂了。

1定义变量在子函数里。
2extern 变量在main函数前就ok!!!

出0入0汤圆

发表于 2011-8-15 09:36:57 | 显示全部楼层
原来如此

出0入0汤圆

发表于 2011-10-14 14:03:15 | 显示全部楼层
终于对static又加深认识了。

出0入42汤圆

发表于 2011-10-14 14:09:01 | 显示全部楼层
回复【12楼】ggddll  
终于搞懂了。
1定义变量在子函数里。
2extern 变量在main函数前就ok!!!
-----------------------------------------------------------------------

都搞懂的啥啊, 唉...

出0入0汤圆

发表于 2011-10-16 12:13:15 | 显示全部楼层
定义在子函数内,在主函数函数体体前加extern 变量是声明。

出0入0汤圆

发表于 2011-11-15 21:42:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-23 14:06:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-26 14:41:47 | 显示全部楼层
非常好,MARK

出0入0汤圆

发表于 2012-8-3 08:16:05 | 显示全部楼层
上面已经给出了解决的办法

出0入0汤圆

发表于 2012-8-3 08:34:47 | 显示全部楼层
you didn't quite get it right.

"extern" doesn't declare a variable: all it does is to tell the compiler that a variable modified by "extern" is to be stored in other modules so you do not allocate storage for the variable.

//sub.h//
extern int h; //h to be defined somewhere else.
...

//sub.c//
int h=0; //initialize h
//define your sub / functions here.

//main.c//

#include "sub.h" //include sub

int main(void) {
  ...
  h +=1; //modify h (decalred in sub.c)
...

出0入0汤圆

发表于 2015-5-10 10:26:08 | 显示全部楼层
好帖子,看完这个帖子,一下子懂了,谢谢楼主,谢谢大家的回答

出0入0汤圆

发表于 2015-5-10 11:29:31 | 显示全部楼层
学习了~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 19:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表