Когда использовать статическое ключевое слово перед глобальными переменными?

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

Например, скажем, у меня есть заголовочный файл с линией:

const float kGameSpriteWidth = 12.0f;

Должно ли это иметь static перед const или нет? Каковы некоторые рекомендации по использованию static?

Ответ 2

Вы не должны определять глобальные переменные в файлах заголовков. Вы должны определить их в исходном файле .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;
    }
    

Ответ 3

Да, используйте статический

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

Никогда не используйте статические файлы .h, потому что каждый раз, когда он будет включен, вы создадите другой объект.

Ответ 4

Правило большого пальца для файлов заголовков:

  • объявить переменную как extern int foo; и поместить соответствующую инициализацию в один исходный файл, чтобы получить изменяемое значение, разделенное между единицами перевода
  • используйте static const int foo = 42;, чтобы получить константу, которая может быть встроена

Ответ 5

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 скомпилирован.

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

Ответ 6

Ключевое слово статическое используется в C до ограничивает видимость функции или переменной ее единицей перевода. Модуль перевода является конечным результатом для компилятора C, из которого создается объектный файл.

Отметьте это: Linkage | Блок перевода

Ответ 7

Правильный механизм для C++ в анонимных пространствах имен. Если вы хотите, чтобы что-то было локальным для вашего файла, вы должны использовать анонимное пространство имен, а не статический модификатор.

Ответ 8

глобальные статические переменные инициализируются во время компиляции в отличие от автоматического