"extern" сообщает компилятору C, что эта функция или переменная была объявлена в другом месте, поэтому вы можете использовать их даже без объявления их в заголовочных файлах и включения .h в файлы .c. Осторожно, «extern» означает, что эта переменная НЕ была начальным объявлением, начальное объявление НЕ ДОЛЖНО иметь ключевое слово extern.
В вашем случае вы объявили переменную extern в одном файле, не добавляя ключевое слово «static», поэтому областью действия переменной будет весь проект. Затем вы объявили "uint16_t externVariable;" в двух местах компилятор решил, что все они изначально имеют одинаковые имена, поэтому начался конфликт.
Например, вы можете сделать что-то вроде этого:
Пример 1:
a.c: uint16_t externVariable;
b.c: extern uint16_t externVariable;
Не беспокойтесь о вашем заголовочном файле, вы можете использовать externVariable как в a.c, так и в b.c.
Пример 2:
a.c: #include "a.h"
b.c: #include "a.h"
a.h: uint16_t externVariable;
Это работает.
Пример 3:
a.c: extern uint16_t externVariable;
b.c: uint16_t externVariable;
c.c: uint16_t externVariable;
Это не сработает, поскольку вы объявили externVariable в нескольких местах.
Пример 4:
a.c: статический uint16_t externVariable;
b.c: статический uint16_t externVariable;
Это БУДЕТ работать, так как ключевое слово "static" ограничило их области действия, поэтому они не будут конфликтовать.
Пример 5:
a.c: статический uint16_t externVariable;
b.c: статический uint16_t externVariable;
c.c: extern uint16_t externVariable;
Это все равно не будет работать, так как ключевое слово "static" ограничило их области действия, и компилятор не может найти, где вы объявили externVariable в c.c.
Вы также можете просмотреть TCPL, он дал большую картину об этих ключевых словах, надеюсь, эти примеры могут помочь:)