Ключевые слова extern
заставляют компилятор рассматривать оператор как объявление, а не как определение. Другими словами, extern
препятствует тому, чтобы компилятор резервировал место для переменной. Таким образом, только модуль компиляции, который не использует extern
, обеспечивает определение, в то время как другие просто используют объявление, которое соответствует «правилу одного определения»; если бы каждая единица компиляции резервировала пространство независимо для одной и той же переменной, это привело бы к нарушению «правила одного определения». Обратите внимание, что extern
буквально означает, что «определение предоставляется извне (другой единицей компиляции)».