如何定义外部变量?

时间:2013-07-10 08:27:43

标签: c declaration definition extern

我对使用extern关键字和C中的变量有一些疑问。我确实浏览了与此问题相关的链接。但是,仍然有一些我没有收集得很好的事情

#include<stdio.h>
    main( )
    {
    extern int i;
    printf ( "\n%d ",i) ) ;
    }
    int i = 31 ;

在上面的代码中,如何在定义语句之前打印?
现在在以下代码中:

#include<stdio.h>
int x = 21 ;
main( )
{extern int i;
 i=20;
printf ( "\n%d ", i ) ;
}

不是声明“i = 20;”定义声明?我得到一个错误。是因为我正在尝试更改其他源文件中定义的变量吗?如果是这种情况,语句如何“int i = 31;”在最顶级的代码片段中使用权?

另外,我读到,“int i;”是一个定义。我真的不怎么做。

4 个答案:

答案 0 :(得分:5)

在第一个程序中,print语句根据i声明打印extern int i的值。这类似于基于其原型声明调用函数而不看其定义。编译器生成代码以检索名为i的全局变量中的值。符号在链接时解析为正确的变量和地址。

在您的第二个程序中,未提供i的定义,仅提供extern int i声明,并尝试使用i = 20设置其值。在链接时,由于没有定义,因此失败,因此解析对全局变量的引用的尝试失败。将i = 20更改为int i = 20会在函数i的范围内创建名为main()的局部变量,并且不再引用全局声明的extern int i。< / p>

在全局范围内使用int i;时,它被视为声明,可以视为一种定义。使用初始化程序声明的全局变量,如:

int i = 20;

始终被视为定义。只允许使用此类型的一个定义,即使每个定义使用相同的初始化值。然而,

int i;

被视为声明。如果出现多个这样的声明,则它们都被视为同一变量的声明。同时,如果没有带初始值设定项的声明,则使用初始值设定项0隐式定义此变量,链接器将能够解析对它的引用。

答案 1 :(得分:1)

在第二个程序中,你还没有在任何地方定义变量,而不是在main之外,而是你在main中定义了它,所以你得到了那个错误。

但是在第一个程序中,你只是定义了一次变量,而且它不在主要部分之内,所以你不会得到那个错误。程序看起来在主要部分之外并找到它的定义。

int i;是AUTO变量(即main或任何函数内)的变量定义声明,但不是extern变量的外部变量,你必须声明它:

extern int i;

然后像这样定义外部主要:

int i;

答案 2 :(得分:1)

变量/函数的声明只是声明变量/函数存在于程序中的某处但是没有为它们分配内存。

来定义,当我们定义一个变量/函数时,除了声明的作用外,它还为该变量/函数分配内存。

所以在第一个程序中,main()之外的int i = 31定义了变量i。然后,此变量仅在main()中声明为extern变量。因此该计划有效。

在第二个程序中,没有在其他地方定义变量i,它直接声明为extern变量。因此它给出了一个错误。

答案 3 :(得分:0)

extern背后的想法是告诉编译器你将使用已经在其使用范围之外定义的变量。

在第二种情况下没有多大意义,因为i被定义为局部变量。 如果您要将其定义为全局,就像在第一种情况下那样,那就没问题了。

如果我可以用一个非常简单的(人为的)案例证明extern的使用:

main.c中:

#include <stdio.h>

extern int a; /* we tell the compiler that a will come from outside the scope of where it is used */

int main()
{
    printf("%d\n", a);

    return 0;
}

由source.c:

int a = 3; /* we define a here */

然后编译这两个.c文件:

$ gcc main.c source.c

这会输出3

您可能还希望阅读this文章。