Технически, так должно быть, но такое использование было в течение многих лет и его невозможно искоренить (его пытались; время от времени некоторые поставщики решают сделать это ошибкой и возвращаются после первых сотен или около того сообщений об ошибках).Педантически файл .h
должен объявить его extern
, а файл один .c
/ .cpp
должен его определить.
Вкратце, когда вы не указываете связь (static
, extern
и т. Д.) Переменной верхнего уровня, она объявлена как "общая".Во время ссылки, если все ссылки на эту переменную имеют одинаковый размер (и тип, если он доступен), тогда она выделяется один раз, и все ссылки делаются для указания на нее.Если компоновщик находит разные размеры / типы / связи для одной и той же переменной, он выдает ошибку.
РЕДАКТИРОВАТЬ: это явно смущает людей.Здесь:
jinx:1714 Z$ cat foo.h
int foo;
extern void bar();
jinx:1715 Z$ cat foo.c
#include "foo.h"
int
main(int argc, char **argv)
{
bar();
return 0;
}
jinx:1716 Z$ cat bar.c
#include "foo.h"
void
bar(void)
{
return;
}
jinx:1717 Z$ gcc -Wall foo.c bar.c -o foo
jinx:1718 Z$ ./foo
jinx:1719 Z$ _
Обратите внимание на полное отсутствие ошибок при многократном определении int foo
. Это - это то, что я пытался сказать.