static
- спецификатор хранилища. Слово «статический» означает неизменное. «Хранение» относится к тому, где объект находится в памяти, то есть его адрес.
Объект с static
хранится по постоянному адресу.
Просто так получилось, что объект с extern
хранилищем также имеет постоянный адрес. Из-за того, как программы на C и C ++ связаны, это необходимо. И поскольку extern
оказывается наименее удивительным поведением, это также значение по умолчанию.
Если вы думаете об этом с точки зрения extern
как дополнительной функции поверх static
, я думаю, что это имеет немного больше смысла. Немного глупо объявлять функцию static
, поскольку в любом полностью скомпилированном языке нет альтернативы, но адрес функции является статическим, даже если он не виден снаружи.
Действительно несогласованная часть заключается в том, что члены класса, которые разделяются между различными блоками компиляции, должны быть объявлены static
, а не extern
…