错误:'i'的extern声明遵循声明而没有链接

时间:2017-08-16 23:19:53

标签: c

在以下计划中,我认为extern int i;会更改以下i以引用在i外定义的main

#include <stdio.h>

extern int i=1; // warning: 'i' initialized and declared 'extern'

int main()
{
    int i=2;
    printf("%d\n", i);
    extern int i; // error: extern declaration of 'i' follows declaration with no linkage
    printf("%d\n", i);
    return 0;
}

“错误的原因是什么:'i'的外部声明遵循没有链接的声明”,其中“没有链接的声明”是指int i=2;

删除int i=2中的main后,

  • 错误消失了,
  • extern int i=1;上的警告“警告:'我'初始化并宣布'extern'”也消失了。那是为什么?

感谢您的解释!

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>

int i=1;  // external variable

int main()
{
    int i=2;            // local variable
    printf("%d\n", i);  // print local variable i==2

    {
    extern int i;       // point to external variable
    printf("%d\n", i);  // print external variable i==1
    }

    return 0;
}

答案 1 :(得分:1)

i函数中定义名为main的变量后,文件范围的i将被屏蔽,无法访问(除非您拥有其地址)。

当您稍后添加声明extern int i时,这会与同一范围内名为i的本地变量冲突,因为本地人不能具有外部链接。它允许您访问全局i

删除本地i时,extern int i声明与文件范围的定义匹配,因此没有错误。关于extern int i=1;上的警告,在gcc 4.1.2上为我消失了,所以这取决于编译器。

答案 2 :(得分:0)

问题:“错误的原因是什么:'i'的外部声明遵循没有链接的声明”,其中“没有链接的声明”是指int i = 2;? <登记/> 答:我们不需要在第3行使用 extern 关键字,因为它是程序中的单个文件,并且同一程序中没有其他文件或同一文件中的其他位置变量 int i 有其定义。我们可以在C中使用 extern 关键字有两个主要原因:
 1.当我们想要显式地/全局地声明变量但没有它的定义时  2.使变量从多文件程序中的任何其他文件或同一文件的其他位置全局可见(请参阅本场景的Ihdina的例子)。
在我的系统上编译代码我得到以下错误,
错误:'i'的外部声明遵循非外部声明。 完全有意义的是编译器在第9行检测到 extern ,作为第7行相同变量 int i 的重复声明。

问题:在main中删除int i = 2后, 错误消失了, extern int i = 1上的警告“警告:'我'初始化并声明'extern'”;也消失了。那是为什么?
答:删除 int i = 2; 后,我的系统上的错误消失了,但我仍然收到以下警告信息:
警告:'extern'变量有一个初始值设定项[-Wextern-initializer] 基本上我的系统( Apple LLVM版本8.1.0(clang-802.0.42))不喜欢使用 extern 关键字进行显式初始化。因此,您应该根据Ihdina的答案修改您的代码,该答案可以无错误地编译。