Это связано с OBJ файлов, как они используются, и как адреса памяти для глобально контекстные переменные, в конечном счете обнаружены в процессе связывания. Объектные файлы содержат адреса всех глобальных данных и функций, определенных в соответствующем cpp. Они откладывают некоторую память соответствующим образом, чтобы рассказать о том, где в этом файле можно найти эти глобальные vars/funcs. Так, например,
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 раньше. В чистом мире 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
"Экстерн" ключевое слово говорится, что это имя является действительным, и его адрес будет получить разрешение на время соединения. Все, кто включил «foo.h» и захотели использовать глобальную переменную «band», теперь могли ее использовать. Во время соединения, компоновщик выяснил, что полосы существуют в foo.obj. Если вы забыли поместить «int band» в foo.obj, вы получили бы ошибку компоновщика и должны решить ее.
В C++ использование static в объявлении класса i похоже.Вы говорите пользователям, что существует эта вещь, называемая «foo :: bands» и где она будет жить, будет решена во время связи. Позже по линии линкер видит, что в foo.obj существует foo :: bands, и все ссылки на foo :: bands могут быть разрешены.
Это не нужно в этом случае. Вы хотели сделать группы статичными? – jalf