удар: Только один процесс
\#!/bin/bash
of() { of; }
of
static
отображает переменную, локальную для файла, что обычно хорошо, см., Например, эту запись в Википедии .
глобальные статические переменные инициализируются во время компиляции в отличие от автоматических
Вы не должны определять глобальные переменные в файлах заголовков. Вы должны определить их в исходном файле .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;
}
Практическое правило для файлов заголовков:
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
.
Обратите внимание, что module - это текущий исходный файл, плюс все включенные файлы. т.е. вам нужно скомпилировать эти файлы отдельно, а затем связать их вместе.
Всегда использовать static в файлах .c
, если вам не нужно ссылаться на объект из другого модуля .c
.
Никогда не используйте static в файлах .h
, потому что вы будет создавать новый объект каждый раз при его включении.
Правильный механизм C ++ в анонимных пространствах имен. Если вам нужно что-то локальное для вашего файла, вам следует использовать анонимное пространство имен, а не статический модификатор.