2010-04-16 84 views
1

任何人都可以请告诉我有什么特殊要求在C程序中使用EXTERNGLOBAL变量吗? 如果我从gloabl变为extern,我在下面的程序中看不到任何区别。extern和c中的全局

#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区别?

任何人都可以请纠正我吗?

+0

除了可能对变量名称的可见性之外,没有行为差异。 – 2010-04-16 11:38:54

回答

19

关键字extern的意思是“这个变量的存储被分配到别处”。它告诉编译器“我在这里引用myGlobalvar,而你之前没有看到它,但没关系,链接器会知道你在说什么。”在您的具体的例子是不是特别有用,因为编译器了解myGlobalvar - 这是在同一个翻译单元前面定义您正常使用extern当你想引用的东西是不是(.c.cc文件。),例如您要链接到的库中定义的变量。

(当然,通常该库将声明extern变量你,在头文件,你应该包括。)

+0

+1,最佳答案。 – 2010-04-16 11:46:15

2

由于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. 
1

myGlobalVar为你定义它是一个全局变量,从你的程序中所有的地方看到。没有必要在同一个.c文件中声明它extern。这对于其他.c文件来说是非常有用的,它让编译器知道这个变量将被使用。

2

Here

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

int myGlobalVariable;

这为数据分配存储空间,并告知编译器您想要使用名称“myGlobalVariable”访问该存储。

但是,如果你想从程序中的另一个模块访问该变量,你会怎么做?你不能使用上面给出的同样的语句,因为那么你将有两个变量名为'myGlobalVariable',这是不允许的。因此,解决方案是让您的其他模块DECLARE变量没有定义它:

extern int myGlobalVariable;

这告诉编译器“在另一个名为myGlobalVariable的模块中定义了一个变量,类型为integer。我希望你能接受我的访问尝试,而是因为另一个模块已经完成,”对于它不分配存储空间。

-1

要了解外部变量和全局变量的基本知识,下面是很重要的。

为什么我们需要glabal变量?

我们需要一个全局变量,以保持一个变量整个编译单元的范围。

什么是编制单位?

这么简单,你也会写PROGR我称之为sample.cc,你已经包含了几个头文件,比如abc1.h abc2.h等。 C和C++编译通常分为三个独立步骤: 1.预处理,替换宏和#include扩展 2。编译,将源代码转换为二进制代码并生成中间对象文件。 3.链接,加入单个ELF或EXE文件中的目标文件。 所以 sample.cc + abc1.h + abc2.h = sample.o(目标文件)=单个编译单元 (一个对象外商投资企业可称为单一的编译单元)

为什么我们使用外部变量?

只有在c/C++中声明变量的方法是使用extern关键字。 extern关键字用于将变量的范围扩展到多个编译单元。 在c/C++中,我们可以使用多个对象文件生成一个可执行文件,因为全局变量单个对象文件的范围和范围extern变量是完整的可执行文件。