了解c中的extern关键字

时间:2014-06-16 13:49:55

标签: c extern

#include <stdio.h>

int main()
{
    extern int a;
    extern int a;
    int a = 10;
    return 0;
}

这段代码有什么问题?由于c中允许多个声明,因此该代码有什么问题

2 个答案:

答案 0 :(得分:1)

代码的问题在于首先通知编译器a是全局变量(由于extern关键字);然后a被定义为本地&#39;自动&#39;变量。因此,a

的定义范围存在冲突

作为自动变量的替代方法,可以定义所有函数外部的变量,即可由任何函数按名称访问的变量。 (这种机制更像是在最外层块中声明的Fortran COMMON或Pascal变量。)因为外部变量是全局可访问的,所以可以使用它们代替参数列表来在函数之间传递数据。此外,因为外部变量永久存在,而不是在函数被调用和退出时出现和消失,所以即使在设置它们的函数返回后它们也保留它们的值。 - C编程语言

外部变量必须在任何函数之外定义一次;这为它预留了存储空间。必须在每个想要访问它的函数中声明变量;这说明了变量的类型。声明可以是明确的外部声明,也可以是上下文隐含的。 ...您应该注意,当我们在本节中引用外部变量时,我们会仔细使用单词定义和声明。定义是指创建变量或分配存储的位置;声明是指声明变量性质但未分配存储空间的地方。 - C编程语言

答案 1 :(得分:0)

从你的问题我发现你正在想象你的程序是这样的

#include <stdio.h>

int main()
{
    extern int a;  //declaration
    extern int a;  //declaration
    int a = 10;    //declaration + definiton
    return 0;
}

以上对extern关键字的理解。你的问题很明显。

让我们彻底了解关键词的使用外部。

外部变量声明是对编译器的一个承诺,即某个地方会有一个全局变量的定义。 Read This。换句话说,extern关键字告诉编译器此刻忘记此变量并将其留给链接器将其与其定义链接。这是外部变量实际上链接到它的定义链接。 此外局部变量根本没有链接。 因此,在搜索其定义时,编译器发现了一个没有链接的定义。那是错误。

根据经验,只要记住在任何函数中将任何变量声明为extern时,你只能在该函数之外定义它。(但是没有使用它)。