static
, вероятно, является наиболее запутанным перегруженным ключевым словом в C и C ++. Это означает разные вещи в разных местах.
static
является классом хранения , обозначающим переменные, которые существуют для времени жизни программы. Поэтому, говоря, что void f() {
static int i = 0;
}
говорит, что значение i
будет сохранено между вызовами f()
. Другие классы хранения являются по умолчанию auto
(но остерегайтесь изменения смысла в C ++ 11), extern
и register
, плюс thread_local
в C11 / C ++ 11. static
является спецификатором linkage . Таким образом, функции и переменные, помеченные static
, имеют внутреннюю связь , и поэтому являются локальными для текущей единицы перевода. Это означает, что функции, подобные static int f() {
return 3;
}
, могут ссылаться только на другие функции внутри одного и того же файла .c
. Это использование static
было устарело в C ++ 03 в пользу неназванных пространств имен. Я читал где-то, что он снова не упоминался в C ++ 11. static
можно использовать в параметре функции массива, например: void f(int a[static 4]) {
}
это указывает, что параметр a
должен иметь целочисленный массив размером не менее 4. Я думаю, что это все из них, но дайте мне знать в комментариях, если они есть, я забыл!