【问题标题】:How to access local and global variable with same name in C如何在C中访问同名的局部变量和全局变量
【发布时间】:2021-01-19 11:06:34
【问题描述】:

我在学校有这个任务,我必须找到以下 C 代码的输出,并解释输出。

#include<stdio.h>
int i;
void fun1(void);
void fun2(void);
int main()
{
    fun1();
    fun2();
    return 0;
}

void fun1(){
    i=20;
    printf("%d\t",i);
}

void fun2(){
    int i=50;
    printf("%d",i);
}

输出为 20 50 因为在 fun1() 中,全局变量“i”被赋值为 20 并被打印出来。而在 fun2() 中,变量 'i' 是一个局部变量,它被声明并初始化为 50,然后被打印出来。

出于好奇,我有以下问题,如何在 fun2() 中使用全局变量“i”? 一个简单的解决方案是简单地更改名称并避免整个事情。但是我的好奇心是由于Java,其中有一个关键字“this”来访问类变量而不是局部变量。

那么有什么办法可以在 C 中做到这一点?

【问题讨论】:

    标签: c scope declaration


    【解决方案1】:

    唯一的办法是在代码块中隐藏局部变量的声明。

    例如

    #include <stdio.h>
    
    int i = 10;
    
    void fun2( void )
    {
        int i = 20;
        printf("local i = %d\n",i);
    
        {
            extern int i;
            printf( "global i = %d\n",i);
        }
    }
    
    int main(void) 
    {
        fun2();
    }
    

    程序输出是

    local i = 20
    global i = 10
    

    【讨论】:

    • 如果我在程序中看到这种代码我会认真考虑是否需要更换程序员
    • @P__J__ 你为什么这么说?
    【解决方案2】:

    无法访问具有同名局部变量的函数内部的全局参数。尽管如您所见,在 C 中创建此类局部变量通常是不好的做法,但并不禁止这样做。 在 C++ 中,您可以使用命名空间来解决它,但在 C 中没有等价物。

    【讨论】:

      【解决方案3】:

      最好的方法是给函数传参数

      void fun2(int fromExternalWorld){
          int i=50;
          printf("%d ",fromExternalWorld);
          printf("%d\n",i);
      }
      
      int main(void)
      {
          fun2(i);
      }
      

      否则不可能有两个同名的符号在同一个范围内可见。

      【讨论】:

        【解决方案4】:

        在声明本地 i 之前,您可以作弊并创建指向全局 i 的指针:

        void fun2( void )
        {
          int *ip = &i; // get address of global i
          int i = 50;   // local i ”shadows" global i
         
          printf( "local i = %d, global i = %d\n", i, *ip );
        }
        

        编辑

        看到这个答案被接受,我必须强调你不应该永远编写这样的代码。这是针对不良编程实践的创可贴。

        尽可能避免使用全局变量,并在不可能的情况下使用明确将它们标记为全局变量且不太可能被隐藏的命名约定(例如以g_ 或类似名称作为前缀)。

        我无法告诉你我浪费了多少时间来追查此类命名冲突引起的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 2016-04-06
          • 2011-08-15
          • 1970-01-01
          相关资源
          最近更新 更多