Когда использовать статическое ключевое слово перед глобальными переменными?
может кто-нибудь объяснить, когда вы должны использовать ключевое слово static перед глобальными переменными или константами, определенными в заголовочных файлах?
например, допустим, у меня есть файл заголовка со строкой:
const float kGameSpriteWidth = 12.0f;
если бы static
перед const
или нет? Каковы некоторые рекомендации по использованию static
?
8 ответов:
static
отображает переменную local в файле, что в целом хорошо, см. например эта запись в Википедии.
не стоит определение глобальные переменные в заголовочных файлах. Вы должны определить их .исходный файл c.
если глобальная переменная должна быть видна только в одном .файл с, вы должны объявить его статическим.
если глобальная переменная должна использоваться через несколько .c файлы, вы не должны объявлять его статическим. Вместо этого вы должны объявить его extern в заголовочном файле, включенном всеми .c файлы, которые нужны оно.
пример:
пример.h
extern int global_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; }
бар.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's not the same local_foo as in foo.c it's another variable which happen to have the same name. this function cannot access local_foo defined in foo.c */ return 0; }
Да, использовать статические
всегда используйте статический in
.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
компилируется.обратите внимание, что модуль источника тока файл плюс все включенные файлы. т. е. вы нужно скомпилировать эти файлы отдельно, а затем связать их вместе.