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


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

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

const float kGameSpriteWidth = 12.0f;

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

8 51

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 компилируется.

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

The static ключевое слово используется в C к ограничения видимость функции или переменной к своей единице перевода. Единица перевода-это конечный вход в компилятор C, из которого генерируется объектный файл.

проверить это: связь | ЕП

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

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