2013-08-28 3 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

* Как это работает? Вы получаете ошибки компиляции? Ошибки компоновщика? Ошибки времени выполнения? –

ответ

1
int 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 

Глобальные ехЬегп переменные также могут быть инициализированы непосредственно, где, как локальные переменные ехЬегп не может быть.

#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

Вы уже объявили i, как a int in

extern int i; 

А затем лет U идти вперед и объявить его снова

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 и не было выделено хранилище, поскольку оно не определено вне основного.

Смежные вопросы