Ответ 1
static
отображает переменную локальную в файл, что обычно хорошо, см., например, эту запись в Википедии.
Может кто-нибудь объяснить, когда вы должны использовать статическое ключевое слово перед глобальными переменными или константами, определенными в файлах заголовков?
Например, скажем, у меня есть заголовочный файл с линией:
const float kGameSpriteWidth = 12.0f;
Должно ли это иметь static
перед const
или нет? Каковы некоторые рекомендации по использованию static
?
static
отображает переменную локальную в файл, что обычно хорошо, см., например, эту запись в Википедии.
Вы не должны определять глобальные переменные в файлах заголовков. Вы должны определить их в исходном файле .c.
Если глобальная переменная должна быть видимой только в одном .c файле, вы должны объявить ее статичной.
Если глобальная переменная должна использоваться в нескольких файлах .c, вы не должны объявлять ее статичной. Вместо этого вы должны объявить его extern в заголовочном файле, включенном всеми .c файлами, которые ему нужны.
Пример:
example.h
extern int global_foo;
foo.c
#include "example.h"
int global_foo = 0;
static int local_foo = 0;
int foo_function()
{
/* sees: global_foo and local_foo
cannot see: local_bar */
return 0;
}
bar.c
#include "example.h"
static int local_bar = 0;
static int local_foo = 0;
int bar_function()
{
/* sees: global_foo, local_bar */
/* sees also local_foo, but it not the same local_foo as in foo.c
it another variable which happen to have the same name.
this function cannot access local_foo defined in foo.c
*/
return 0;
}
Всегда используйте static в файлах .c
, если вам не нужно ссылаться на объект из другого модуля .c
.
Никогда не используйте статические файлы .h
, потому что каждый раз, когда он будет включен, вы создадите другой объект.
Правило большого пальца для файлов заголовков:
extern int foo;
и поместить соответствующую инициализацию в один исходный файл, чтобы получить изменяемое значение, разделенное между единицами переводаstatic const int foo = 42;
, чтобы получить константу, которая может быть встроена static
до того, как глобальная переменная означает, что эта переменная недоступна из-за пределов модуля компиляции, где она определена.
например. представьте, что вы хотите получить доступ к переменной в другом модуле:
foo.c
int var; // a global variable that can be accessed from another module
// static int var; means that var is local to the module only.
...
bar.c
extern int var; // use the variable in foo.c
...
Теперь, если вы объявляете var
статическим, вы не можете получить к нему доступ нигде, кроме модуля, в который foo.c
скомпилирован.
Обратите внимание, что модуль является текущим исходным файлом, а также всеми включенными файлами. т.е. вы должны скомпилировать эти файлы отдельно, а затем соединить их вместе.
Ключевое слово статическое используется в C до ограничивает видимость функции или переменной ее единицей перевода. Модуль перевода является конечным результатом для компилятора C, из которого создается объектный файл.
Отметьте это: Linkage | Блок перевода
Правильный механизм для C++ в анонимных пространствах имен. Если вы хотите, чтобы что-то было локальным для вашего файла, вы должны использовать анонимное пространство имен, а не статический модификатор.
глобальные статические переменные инициализируются во время компиляции в отличие от автоматического