Это имеет отношение к файлам obj, как они используются и как адреса памяти для глобально изменяемых переменных в конечном итоге обнаруживаются в процессе связывания. Объектные файлы содержат адреса всех глобальных данных и функций, определенных в соответствующем cpp. Они размещают некоторую память относительно, чтобы указать, где в этом файле можно найти эти глобальные переменные / переменные. Так например
function doFoo can be found 0 bytes from beginning of this file
int foo::bands can be found 12 bytes from beginning of this file
etc
Практически легче думать, если вы уже делали прямо C. В чистом мире Си вы будете делать вещи в более традиционном смысле модульного программирования. Ваш модуль будет определен с заголовком и cpp. Заголовок будет определять «публичную» переменную, как показано ниже, используя ключевое слово extern, а затем создавать ее экземпляр в cpp.
foo.h
extern int bands;
foo.cpp
#include "foo.h"
int bands;
foo.obj:
int bands can be found 0 bytes from the beginning of this file
Ключевое слово "extern" указывает, что это имя является действительным, и его адрес будет разрешен во время ссылки. Все, кто включал «foo.h» и хотел использовать глобальную переменную «bars», теперь мог ее использовать. Во время соединения компоновщик выяснит, что в foo.obj существуют полосы. Если вы забыли добавить «int band» в foo.obj, вы получите ошибку компоновщика, и вам придется ее устранить.
В C ++ с использованием static в объявлении класса я похож. Вы говорите пользователям, что существует такая вещь, называемая "foo :: band", и где она будет жить, будет решена во время ссылки. Позже компоновщик увидит, что в foo.obj существует foo :: band, и все ссылки на foo :: band могут быть разрешены.