Я слышал, что вы не должны определять что-либо в заголовочных файлах из-за возможности множественных определений, но если у вас есть защита, это не должно происходить, верно? Какие еще причины для добавления extern к переменным?
Включение защиты просто предотвращает многократное включение заголовка в одну единицу перевода (она же единица компиляции ). Это не решает проблему множественных определений из отдельных единиц перевода во время соединения. Следовательно, вы должны когда-либо помещать объявлений в заголовочные файлы (.h) и определений в исходные (.c) файлы.
Обычно вы объявляете extern переменные в заголовочных файлах, когда переменная определена в одном исходном файле (точнее, в одной единице перевода ) и на нее ссылаются в другом.
extern