Первая программа сказала:
- Переменная
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;
Это определяет переменную после функции - обычную, но допустимую. В качестве альтернативы он может находиться в отдельном исходном файле, который отдельно компилируется и затем связывается с основной программой.
Второй пример можно исправить с помощью:
#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;
Опять же, обычное размещение, но законное.
Третий может быть исправлен аналогично первым двум, или этот вариант:
#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;
insides main()
вдвойне избыточен - определение в исходном файле и объявление в заголовке означают, что его не нужно повторно декларировать внутри main()
. Обратите внимание, что в общем случае объявление в заголовке и определение в исходном файле не являются избыточными; объявление в заголовке обеспечивает проверку согласованности с определением, а другие файлы, которые также используют переменную и заголовок, затем гарантируют, что определение в файле, содержащем main()
, эквивалентно определению, используемому другим файлом. .