6

谁能告诉我在 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区别吗?

谁能纠正我?

4

5 回答 5

31

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

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

于 2010-04-16T11:42:54.923 回答
14

这里

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

int myGlobalVariable;

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

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

extern int myGlobalVariable;

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

于 2010-04-16T11:44:57.533 回答
4

自从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.
于 2010-04-16T11:42:15.343 回答
4

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

例如:

我的文件.cpp

int global_var = 3;
int main(){
}

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

我的文件.cpp

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

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

因此,如果您尝试以下操作,则my_file.cppglobal_varother_file.cpp中声明, :

其他文件.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'
}
于 2020-11-10T18:50:42.973 回答
1

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

于 2010-04-16T11:42:19.580 回答