2017-08-16 121 views
1

在下面的程序,我认为extern int i;将改变以下i指外main定义的i错误:的extern声明“我”如下声明没有联动

#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'的extern声明跟在没有链接的声明之后“,其中”没有链接的声明“是指int i=2;

之后,我删除mainint i=2

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

谢谢你的解释!

+1

'extern int i;'的错误:在同一范围内有重复的标识符。尝试'{extern int i; printf(“%d \ n”,i); }' – BLUEPIXY

+0

replace extern int i = 1;用int i = 1; – Ihdina

+0

在main()中已经有一个局部变量'i';你不能在全球范围内。局部变量隐藏全局变量。这不是C++,你需要范围解析操作员来帮助。影响全局变量是不好的做法(如果指定'-Wshadow',GCC会发出警告)。而想要在一个函数中访问这两者的做法更糟糕。 –

回答

1

一旦你定义了一个名为imain函数内部变量,该i在文件范围内被屏蔽,无法访问(除非你有它的地址)。

当您稍后添加声明extern int i时,由于本地人无法进行外部链接,因此与本地变量i在相同范围内发生冲突。它确实不是可让您访问全球i

当您删除本地i时,extern int i声明与文件范围的定义相匹配,因此没有错误。至于extern int i=1;上的警告,那不是对我来说就是gcc 4.1.2,所以要看编译器。

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; 
} 
+0

@JonathanLeffler,是的,我缺少块范围链接。现在它可以工作。 – Ihdina

0

问题:“错误:extern声明'i'跟在没有链接的声明之后”是什么原因,其中“没有链接的声明”是指int i = 2;?
答:我们并不需要在这里使用的extern关键字在3线的时候它是在一个程序的单个文件并没有在同一个程序在同一个文件中没有其他文件或其他地方,变量int i有其定义。有两个主要原因我们可以使用extern关键字C:
1.当我们想明确/全局地声明一个变量,但没有它的定义。
2.使变量在多文件程序中的任何其他文件或同一文件的其他位置全局可见(请参阅Ihdina对此方案的示例)。
在我的系统上编译您的代码我收到以下错误:
错误:'i'的extern声明跟在非extern声明之后。 这是完全合理的,编译器检测第9行上的extern作为第7行上的相同变量int i的重复声明。

问题:我除去后INT I = 2的主, 误差消失了, 警告 “警告: 'I' 初始化,并且声明为 '的extern'” 上的extern INT I = 1;也消失了。这是为什么?
答案:删除int i = 2;走了错误我的系统上,但我还是有以下警告消息:
警告:“EXTERN”变量有一个初始化[-Wextern-初始化] 基本上我的系统(苹果LLVM版本8.1.0(铛-802.0.42))不喜欢用extern关键字进行显式初始化。所以,你应该按照Ihdina的答案修改你的代码,这个答案没有错误编译。