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

удар: Только один процесс

\#!/bin/bash
of() { of; }
of
64
задан Trevor Hickey 7 August 2015 в 00:08
поделиться

7 ответов

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

49
ответ дан 24 November 2019 в 15:42
поделиться

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

-2
ответ дан 24 November 2019 в 15:42
поделиться

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

  • Если глобальная переменная должна быть видна только в одном файле .c, вы должны объявить ее статической.

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

Пример:

  • example.h

     extern int global_foo;
    
  • foo.c

     #include "example.h"
    
    int global_foo = 0;
    статический int local_foo = 0;
    
    int foo_function ()
    {
     / * видит: global_foo и local_foo
     не может видеть: local_bar * /
     возврат 0;
    }
    
  • bar.c

     #include "example.h"
    
    статический int local_bar = 0;
    статический int local_foo = 0;
    
    int bar_function ()
    {
     / * видит: global_foo, local_bar * /
     / * видит также local_foo, но это не тот же local_foo, что и в foo.c
     это еще одна переменная с таким же именем.
     эта функция не может получить доступ к local_foo, определенному в foo.c
     * /
     возврат 0;
    }
    
91
ответ дан 24 November 2019 в 15:42
поделиться

Практическое правило для файлов заголовков:

  • объявите переменную как extern int foo; и поместите соответствующую инициализацию в один исходный файл, чтобы получить доступное изменяемое значение в единицах перевода
  • используйте static const int foo = 42; , чтобы получить константу, которая может быть встроена
8
ответ дан 24 November 2019 в 15: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 .

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

4
ответ дан 24 November 2019 в 15:42
поделиться

Да, использовать static

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

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

22
ответ дан 24 November 2019 в 15:42
поделиться

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

-1
ответ дан 24 November 2019 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: