2010-11-25 1 views
8

Я объявил переменную я в temp2.h extern i;, который содержит только один над линией и сделал еще один файл temp3.cпредупреждение в экстерном декларации

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 
extern i; 
i=6; 
printf("The i is %d",i); 
} 

Когда я собирал выше как cc -I ./ temp3.c я получил следующее ошибки

/tmp/ccJcwZyy.o: In function `main': 
temp3.c:(.text+0x6): undefined reference to `i' 
temp3.c:(.text+0x10): undefined reference to `i' 
collect2: ld returned 1 exit status 

Я объявил extern в temp3.c выше, как указано в KR стр. 33, как я упоминал выше. я попробовал другой путь для temp3.c с одинаковым заголовком файла temp2.h

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 

i=6; 
printf("The i is %d",i); 
} 

и составил его cc -I ./ temp3.c и получил следующие ошибки

/tmp/ccZZyGsL.o: In function `main': 
temp3.c:(.text+0x6): undefined reference to `i' 
temp3.c:(.text+0x10): undefined reference to `i' 
collect2: ld returned 1 exit status 

Я также попытался

#include<stdio.h> 
#include<temp2.h> 
int main() 
{ 
extern i=6; 
printf("The i is %d",i); 
} 

составлен этот один

cc -I ./ temp3.c 

получил ту же ошибку, как в посте 1

temp3.c: In function ‘main’: 
temp3.c:5: error: ‘i’ has both ‘extern’ and initializer 

Так что я пытался по крайней мере 3 различных способа использования ехЬегп, но не из них работали.

ответ

14

Когда вы объявляете переменную с использованием extern, вы сообщаете компилятору, что переменная определена в другом месте, и определение будет предоставлено во время соединения. Включение совсем другое.

extern

Внешняя переменная должна быть определена, ровно один раз, вне какой-либо функции; это откладывает хранение для него. Переменная должна также быть объявлена ​​в каждой функции, которая хочет получить к ней доступ; это указывает тип переменной. Объявление может быть явным выражением extern или может быть неявным из контекста.

-The Язык программирования C

Переменный должен быть определен один раз в одном из модулей (в одном из перевода единиц) программы. Если нет определения или более одного, возникает ошибка, возможно, на этапе ссылки (как в примерах 1 и 2).

Попробуйте что-то вроде следующего

a.c

int i =10; //definition 

b.c

extern int i; //declaration 
int main() 
{ 
    printf("%d",i); 
} 

Compile, ссылки и создать исполняемый файл, используя

gcc a.c b.c -o executable_name 

или


gcc -c a.c // creates a.o 
gcc -c b.c // creates b.o 

Теперь скомпоновать объектные файлы и создать исполняемый

gcc a.o b.o -o executable_name 
2

ехЬегп является механизм декларирования используется, чтобы сообщить компилятору, что переменная определена в другом файле.

Мое предложение состоит в том, что вы определяете переменную в файле «.c», а затем добавляете объявление extern в соответствующий «.h» файл. Таким образом, объявление переменной будет доступно для всех исходных файлов, которые включают этот заголовочный файл, а также будет легче идентифицировать, в котором «.c» он фактически определен.

4

Первая программа говорит:

  • Переменная i (неявно типа int) определяется где-то еще - но вы не определили его в любом месте.

Вторая программа попыталась использовать переменную, для которой вообще не было декларации.

Третья программа попыталась объявить переменную без явного типа (используется, чтобы быть в норме, не допускается в C99), и сказал:

  • Переменная i определена где-то еще, но я хочу, чтобы инициализировать это здесь.

Вам не разрешено это делать.

Итак, компилятор верен во всех случаях.


Декларация в заголовке «temp2.h» должен быть закреплен extern int i; первой. Неявный int давно устарел.

Вы можете зафиксировать первый пример несколькими способами:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    extern int i; 
    i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

int i; 

Это определяет переменную после функции - aconventional но легитимной. Он может альтернативно быть в отдельном исходном файле, который отдельно компилируется, а затем связан с основной программой.

Второй пример может быть исправлено с:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    int i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

Важно отметить, что этот пример теперь имеет две переменные, называемые i; тот, который указан в temp2.h (но на самом деле нигде не упоминается), и тот, который определен в main(). Другой способ фиксации его такая же, как и в первом возможном затруднительного:

#include <stdio.h> 
#include <temp2.h> 
int main() 
{ 
    i=6; 
    printf("The i is %d",i); 
    return 0; 
} 

int i; 

Опять же, aconventional размещение, но законно.

Третий может быть закреплен с помощью аналогичных методов к первым двум, или этот вариант:

#include <stdio.h> 
#include <temp2.h> 
int i; 
int main() 
{ 
extern int i; 
i=6; 
printf("The i is %d",i); 
return 0; 
} 

Это еще объявляет i в <temp2.h>, но определяет его в исходном файле, содержащем main() (обычно помещают - по вверху файла). extern int i; внутренности main() вдвойне избыточны - определение в исходном файле и декларация в заголовке означает, что его не нужно обновлять внутри main(). Обратите внимание, что в целом декларация в заголовке и определение в исходном файле не являются избыточными; объявление в заголовке обеспечивает проверку согласованности с определением, а другие файлы, которые также используют переменную и заголовок, затем гарантируют, что определение в файле, содержащем main(), эквивалентно определению, используемому другим файлом.

+0

Я хочу, чтобы эта переменная i была доступна и во многих других файлах. Что я буду делать, а значение, которое будет изменено в одном файле любым вызовом функции, тогда другой модуль или c-программа, которая может быть использована, должна получать измененное значение . Так что я хочу, чтобы переменная была глобальной для всех модулей. До вашего сообщения я не знал, как работает extern. Я думал, что extern - это способ сделать переменную глобальную. – 2010-11-25 07:33:19

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