2013-08-28 64 views
1

我不明白为什么这不起作用。谢谢!为什么这个代码不工作?

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

编译结果中出现以下错误:

main.c: In function 'main': 
main.c:6:9: error: declaration of 'i' with no linkage follows extern declaration 
main.c:5:16: note: previous declaration of 'i' was here 

注:代码在CompileOnline

+11

* How *不起作用?你得到编译错误?链接器错误?运行时错误? –

回答

1
int i; 

这里变量i声明和内存再次声明分配给它但未初始化。

extern int i; 

无论何时使用extern,该变量只是声明和内存不会分配给它。为了访问它,你必须从外部重新声明相同的变量。 这里extern指的是,你将在程序外部(外部源)定义变量(i)的值。在你的情况下,你在里面这样做,所以它不会像你期望的那样工作。它可以在主程序之外或通过外部程序来定义。

试试这个:

#include<stdio.h> 
int main() 
{ 
    extern int i; //Declared but memory not allocated 
    printf("%d",i); 
return 0; 
} 
int i=20; //Allocated memory for i and initialized to 20 outside the prog 

输出:

20 

全球的extern变量也可以直接初始化,在当地的extern变量是不可能的。

#include<stdio.h> 
extern int i=10; //Declared, Memory allocated and defined. 
int main() 
{ 
    extern int j; //Declared but memory not allocated 
    printf("%d --> %d",i,j); 
return 0; 
} 
int j=20; //Memory Allocated and value defined externally. 

输出:

10 --> 20 

您也可以参考这个link更多地了解它。

8

这一在线编译将无法工作,因为你想在两个非常不同的方式使用i在相同的范围内。

名称i不能引用一些extern数据别人是定义,一个局部变量。

如果你只是想分配给外部变量,不要再声明它:

extern int i; 

i = 20; 
+1

但是为'i'分配的存储空间在哪里,因为它在'main'之外的程序中没有定义。不是连接器抱怨吗? –

+0

i的存储分配在我们的程序中必须包含的外部源文件中。 – amiageek

3

你是错误的重新声明i

#include <stdio.h> 
#include <conio.h> 
int main() 
{ 
    extern int i; 
    i=20;  //Simply assign the value here. why redeclare with `int` 
    printf("%d",i); 
} 
3

你已经宣布iint in

extern int i; 

然后哟ü继续前进,与

int i=20; 

尝试这样做,而不是

extern int i; 
i=20; 
1

你声明i其中两次导致重新定义错误

0

extern向编译器指示外部某处存在称为i的变量,其类型为int

这里,outside可以在同一个程序或其他translation(另一个.c文件)单位。

但是您将重新宣布您已经声明的i

另外,如果你只执行以下程序(不链接其他文件.c)它不会工作:

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

它给出了一个链接错误抱怨i是未解决的,因为链接器无法找到i的定义并且没有存储分配给它,因为它没有在主体之外定义。