搜索
bottom↓
回复: 2

keil c中 函数内部的静态局部变量可以和其他被调函数同名么

[复制链接]

出0入0汤圆

发表于 2012-4-6 18:39:03 | 显示全部楼层 |阅读模式
比如:fun1()和fun2()
中静态局部变量i重名,这时i会怎么表现呢??

#define  UINT8   unsigned char

void  fun2(void)
{

    static UINT8  i;

         i++;

         if(i%2 == 0)
         {
                    P4        = 0x30;

         }
         else
         {

            P4        = 0x31;

         }
         
}
   
void  fun1(void)
{
   static  UINT8  i;

   for(i=0; i<5; i++)
   {
       fun2();
   }
}
//--------------------------------------------------------------------------------
void  main(void)
{
   // UINT8  i;
   
    //SysInit();

    for(;;)
    {
                  fun1();
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-6 19:02:51 | 显示全部楼层
可以。你要理解静态局部变量的作用域仅在函数内中。

出0入0汤圆

 楼主| 发表于 2012-4-7 11:58:20 | 显示全部楼层
C51 COMPILER V9.00   MAIN                                                                  04/07/2012 11:54:13 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.C LARGE OPTIMIZE(0,SPEED) CODE

line level    source

   1          #include "c8051f340.h"
   2         
   3          #define  UINT8   unsigned char
   4         
   5          UINT8  fun2(void)
   6          {
   7   1      
   8   1          static UINT8  i;
   9   1      
  10   1               i++;
  11   1               return i;
  12   1      }
  13              
  14          void  fun1(void)
  15          {
  16   1         static  UINT8 i;
  17   1      
  18   1          i = fun2();
  19   1      }
  20          //--------------------------------------------------------------------------------
  21          void  main(void)
  22          {
  23   1          for(;;)
  24   1          {
  25   2                        fun1();
  26   2          }
  27   1      }
  28         
  29         
  30         
  31          //---------------------- the End ----------------------------------
C51 COMPILER V9.00   MAIN                                                                  04/07/2012 11:54:13 PAGE 2   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION fun2 (BEGIN)
                                           ; SOURCE LINE # 5
                                           ; SOURCE LINE # 6
                                           ; SOURCE LINE # 10
0000 900000      R     MOV     DPTR,#i
0003 E0                MOVX    A,@DPTR
0004 04                INC     A
0005 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 11
0006 900000      R     MOV     DPTR,#i
0009 E0                MOVX    A,@DPTR
000A FF                MOV     R7,A
                                           ; SOURCE LINE # 12
000B         ?C0001:
000B 22                RET     
             ; FUNCTION fun2 (END)

             ; FUNCTION fun1 (BEGIN)
                                           ; SOURCE LINE # 14
                                           ; SOURCE LINE # 15
                                           ; SOURCE LINE # 18
0000 120000      R     LCALL   fun2
0003 900000      R     MOV     DPTR,#i
0006 EF                MOV     A,R7
0007 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 19
0008         ?C0002:
0008 22                RET     
             ; FUNCTION fun1 (END)

             ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 21
                                           ; SOURCE LINE # 22
                                           ; SOURCE LINE # 23
0000         ?C0003:
                                           ; SOURCE LINE # 24
                                           ; SOURCE LINE # 25
0000 120000      R     LCALL   fun1
                                           ; SOURCE LINE # 26
0003 80FB              SJMP    ?C0003
0005         ?C0004:
                                           ; SOURCE LINE # 27
0005         ?C0005:
0005 22                RET     
             ; FUNCTION main (END)



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =     27    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      2    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)




============================

这是一个简单的函数及其汇编,我看到fun1(),fun2()中访问的都是 #i
也就是说在内存里用的是同一个地址
结果是:大概不能重名??
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 01:52

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

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