Объявления переменных в заголовочных файлах - статические или нет? - PullRequest
85 голосов
/ 18 сентября 2008

При рефакторинге некоторых #defines я столкнулся с объявлениями, похожими на следующие в заголовочном файле C ++:

static const unsigned int VAL = 42;
const unsigned int ANOTHER_VAL = 37;

Вопрос в том, какая разница, если таковая будет, будет иметь статическое значение? Обратите внимание, что многократное включение заголовков невозможно из-за классического трюка #ifndef HEADER #define HEADER #endif (если это имеет значение).

Означает ли статическое значение, что создается только одна копия VAL, если заголовок включен более чем в один исходный файл?

Ответы [ 12 ]

0 голосов
/ 18 сентября 2008

Static запрещает компилятору добавлять несколько экземпляров. Это становится менее важным с защитой #ifndef, но при условии, что заголовок включен в две отдельные библиотеки и приложение связано, будут включены два экземпляра.

0 голосов
/ 18 сентября 2008

Static не позволяет другому модулю компиляции выходить за пределы этой переменной, так что компилятор может просто «встроить» значение переменной там, где она используется, и не создавать для нее память.

Во втором примере компилятор не может предположить, что какой-либо другой исходный файл не будет его извлекать, поэтому он должен где-то хранить это значение в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...