1

我对在 C 中使用带有变量的 extern 关键字有一些疑问。我确实浏览了与这个问题相关的链接。不过还是有几样东西没收集好

#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

4 回答 4

5

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

在您的第二个程序中,没有提供定义i,只提供extern int i声明,并尝试使用i = 20. 在链接时这会失败,因为没有定义,因此解析对全局变量的引用的尝试失败。改为i = 20创建一个在函数范围内int i = 20命名的局部变量,并且不再引用全局声明的。imain()extern int i

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

int i = 20;

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

int i;

被视为声明。如果出现多个这些声明,则它们都被视为同一变量的声明。同时,如果不存在带有初始化器的声明,则此变量将隐式定义为初始化器为 0,并且链接器将能够解析对它的引用。

于 2013-07-10T08:39:12.897 回答
1

在第二个程序中,您没有在任何地方定义变量,而不是在 main 之外,而是在 main 内部定义了它,所以您会收到该错误。

但是在第一个程序中,您定义了一次变量,并且在主程序之外,因此您不会收到该错误。程序在主程序之外查找并找到它的定义。

int i;是一个变量定义声明,既适用于 AUTO 变量(即内部 main 或任何函数),但不适用于外部变量的extern变量,您必须像这样声明它:

extern int i;

然后像这样定义外部main:

int i;

于 2013-07-10T08:41:27.900 回答
1

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

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

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

在第二个程序中,没有在别处定义变量 i,直接声明为外部变量。因此它给出了一个错误。

于 2013-07-10T08:44:51.147 回答
0

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

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

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

主.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;
}

来源.c:

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

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

$ gcc main.c source.c

这输出3.

您可能还想阅读本文

于 2013-07-10T08:44:19.140 回答