https://www.youtube.com/watch?v=G_jcBrrYPAs&t=1108s
Единицы трансляции (translation unit) - сущность формируемая precrocessor, компилируя их мы получаем объектные файлы.
Второй пример (a'.cpp) не соберется из-за static
, т.к. это изменит линковку функции, и она будет видна только в своей единице трансляции.
Всего в C++ есть 3 вида linkage:
External - доступна во всех единицах трансляции.
Internal - только в текущей трансляции.
No - только в текущей области видимости.
В первом случаем переменная всегда будет 0, во втором же переменная проинициализируется в первый раз 0 и память под нее будет выделена в начале программы, а далее все время будет "жить" и хранить значение.