【问题标题】:extern and global in cc语言中的外部和全局
【发布时间】:2010-04-16 11:36:32
【问题描述】:

谁能告诉我在 C 程序中使用 EXTERNGLOBAL 变量有什么特殊要求吗? 如果我从 gloabl 更改为 extern,我看不出像下面这样的程序有什么不同。

#include <stdio.h>
#include <stdlib.h>
int myGlobalvar = 10;

int main(int argc, char *argv[])
{
  int myFunc(int);
  int i;
  i = 12;
  myGlobalvar = 100;
  printf("Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  i = myFunc(10);
  printf("Value of passed value : %d\n",i);
  printf("again Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  system("PAUSE");  
  return 0;
}
int myFunc(int i)
{
    i = 20 + 1000;
//extern int myGlobalvar;
myGlobalvar = 20000;
//    printf("Value of passed value : %d",i);
return i;
}

如果取消注释extern int myGlobalvar,则值不会改变。

两者之间有correct 的区别吗?

谁能纠正我?

【问题讨论】:

  • 没有行为差异,除了可能在变量名的可见性上。

标签: c variables extern


【解决方案1】:

关键字extern 的意思是“这个变量的存储分配在别处”。它告诉编译器“我在这里引用myGlobalvar,你以前没见过,但没关系;链接器会知道你在说什么。”在您的具体示例中,它并不是特别有用,因为编译器确实知道myGlobalvar——它之前在同一个翻译单元(.c.cc 文件中定义。)您通常使用@ 987654326@ 当您想要引用当前翻译单元中的内容时,例如在您将链接到的库中定义的变量。

(当然,通常该库会在您应该包含的头文件中为您声明extern 变量。)

【讨论】:

    【解决方案2】:

    来自Here

    C/C++ 中的全局变量是可以从程序中的任何模块访问的变量。

    int myGlobalVariable;

    这会为数据分配存储空间,并告诉编译器您要访问名为“myGlobalVariable”的存储空间。

    但是,如果您想从程序中的另一个模块访问该变量,该怎么办?您不能使用上面给出的相同语句,因为这样您将有 2 个名为“myGlobalVariable”的变量,这是不允许的。因此,解决方案是让您的其他模块在不定义变量的情况下声明变量:

    extern int myGlobalVariable;

    这告诉编译器“在另一个名为 myGlobalVariable 的模块中定义了一个整数类型的变量。我希望您接受我访问它的尝试,但不要为它分配存储空间,因为另一个模块已经这样做了”。

    【讨论】:

      【解决方案3】:

      由于myGlobalvar 一直是defined 之前函数myFunc。它在函数内部的declaration 是多余的。

      但是如果definition函数之后,我们必须有declaration

      int myFunc(int i)
      {
          i = 20 + 1000;
          extern int myGlobalvar; // Declaration must now.
          myGlobalvar = 20000;
          printf("Value of passed value : %d",i);
          return i;
      }
      
      int myGlobalvar = 10; // Def after the function.
      

      【讨论】:

        【解决方案4】:

        简而言之:GLOBAL 变量在一个文件中声明。但是它们只能在另一个文件中使用EXTERN 之前的单词访问(在这个另一个文件中)。在同一个文件中,不需要EXTERN

        例如:

        my_file.cpp

        int global_var = 3;
        int main(){
        }
        

        您可以访问同一文件中的全局变量。不用EXTERN

        my_file.cpp

        int global_var = 3;
        int main(){
            ++global_var;
            std::cout << global_var; // Displays '4'
        }
        

        根据定义,全局变量也可以被所有其他文件访问。 但是,在这种情况下,您需要使用 EXTERN 访问全局变量。

        因此,如果您尝试以下操作,my_file.cppother_file.cpp 中声明 global_var

        other_file.cpp

        int main(){
            ++global_var; // ERROR!!! Compiler is complaining of a 'non-declared' variable
            std::cout << global_var; 
        }
        

        改为:

        int main(){
            extern int global_var;//Note: 'int global_var' without 'extern' would
                                  // simply create a separate different variable
            ++global_var;         // and '++global_var' wouldn't work since it'll
                                  // complain that the variable was not initiazed.
            std::cout << global_var; // WORKING: it shows '4'
        }
        

        【讨论】:

        • 很好的解释
        【解决方案5】:

        myGlobalVar 正如您所定义的,它是一个全局变量,在您程序的所有位置都可见。无需在同一个 .c 文件中声明 extern 。这对于其他 .c 文件让编译器知道该变量将被使用很有用。

        【讨论】:

          猜你喜欢
          • 2020-08-08
          • 1970-01-01
          • 1970-01-01
          • 2012-06-18
          • 2012-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多