【问题标题】:Accessing the global variable when global and local variables have same name当全局变量和局部变量同名时访问全局变量
【发布时间】:2012-06-08 07:42:15
【问题描述】:

我对下面的代码有些怀疑

  #include<stdio.h>
   int i=6;
    int main()
     {
      int i=4;
      {
       extern int i;
       printf("%d",i); //prints 6
      }
      printf("%d",i); //prints 4
     }

我们知道extern 关键字表示编译器,变量在外部某处。所以问题是为什么extern 关键字访问全局i 变量而不是主函数中的i 变量?我在想一定存在矛盾,因为这两个变量都可以作为全局变量供内括号使用。 extern 关键字是访问函数外的变量还是访问大括号外的变量也是如此。

【问题讨论】:

  • int i=4; 不是您所说的全局变量。它之所以可用,仅仅是因为它在父范围内。不确定您的困惑是什么?

标签: c extern


【解决方案1】:

extern 不是在当前作用域之外,而是指一个有外部链接的对象。自动变量从不具有外部链接,因此您的声明 extern int i 不可能引用它。因此它隐藏了它,就像自动变量隐藏了全局一样。

【讨论】:

    【解决方案2】:

    在打印 6 的 printf 之前,您要求编译器使用在 #include 之后定义的 i。然后右大括号告诉编译器extern 不再有效,因此它使用i 设置为4 的范围。

    【讨论】:

      【解决方案3】:

      int i=4 不是全局变量,如果您尝试在另一个函数中访问 main 内部的 var i,您的编译器将抛出有关 var 的错误i 未声明。这段代码说明了这一点。

      void func() {
          printf("i is %d\n",i);
      }
      
      main() {
          int i=10;
          func();
      }
      

      而 main 之外的 i 是全局变量,您可以在所有函数中访问它。

      【讨论】:

        【解决方案4】:

        我认为您是在问您是否正确地认为 extern int i 声明应该导致第一个 printfi 解析为 4 因为该 int i=4 语句在父范围内声明 extern 的范围。

        答案是否定的,因此您所看到的行为。函数内的 extern 声明用于声明 external 变量的存在,并且永远不会解析为 local 变量(声明为 within 函数)。

        【讨论】:

          【解决方案5】:

          /* Ed Heal 所说的 */ 然而,我认为最好用额外的例子来说明它。我修改了你的例子来做更多的事情。代码中的 cmets 说明了大部分内容:

          #include <stdio.h>
          int i = 6;
          int main(void)
          {
              int i = 4;
              printf("%d\n", i); /* prints 4 */
              {
                  extern int i; /* this i is now "current". */
                  printf("%d\n", i); /* prints 6 */
                  {
                      int *x = &i; /* Save the address of the "old" i,
                                    * before making a new one. */
                      int i = 32; /* one more i. Becomes the "current" i.*/
                      printf("%d\n", i); /* prints 32 */
                      printf("%d\n", *x); /* prints 6 - "old" i through a pointer.*/
                  }
                  /* The "previous" i goes out of scope.
                   * That extern one is "current" again. */
                  printf("%d\n", i); /* prints 6 again */
              }
              /* That extern i goes out of scope.
               * The only remaining i is now "current". */
              printf("%d\n", i); /* prints 4 again */
              return 0;
          }
          

          【讨论】:

            最近更新 更多