Закрыть.
Все, что находится в глобальной области видимости (т.е. вне функции), по умолчанию статично.
например:
//main.c
int myVar; // global, and static
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; //other C files can see and use this global/static variable
Однако, если вы явно объявить что-то в глобальном масштабе, как статические, она не только статические, но она видна только внутри этого файла. Другие файлы не могут его увидеть.
//main.c
static int myVar; // global, and static
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; // compiler error; "myVar" can only be seen by
// code in main.c since it was explicitly
// declared static at the global scope
Кроме того, по умолчанию нет «extern». Обычно вы используете extern для доступа к глобальным переменным из других файлов, если они не были явно объявлены как статические, как в приведенном выше примере.
const означает, что данные не могут измениться, независимо от его объема. Это не означает, что внешний или статический. Что-то может быть «extern const» или «extern», но «extern static» на самом деле не имеет смысла.
В качестве последнего примера этот код будет построен на большинстве компиляторов, но он имеет проблему: myVar всегда объявляется «extern», даже в файле, который его технически создает. Неудачный пример:
//main.c
extern int myVar; // global, and static, but redundant, and might not work
// on some compilers; don't do this; at least one .C file
// should contain the line "int myVar" if you want it
// accessible by other files
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; //other C files can see and use this global/static variable
Наконец, вы можете захотеть, чтобы покрыть этот пост на различных уровнях объема, если вы еще не знакомы с ними.Это, вероятно, будет полезно и информативно для вас. Удачи!
Terminology definition - Scope in C application
Человек, который ответил на этот вопрос мой о сфере проделал хорошую работу, на мой взгляд.
Кроме того, если вы заявляете что-то статическое внутри функции, значение остается между вызовами функций.
например:
int myFunc(int input) {
static int statInt = 5;
printf("Input:%d statInt:%d",input,statInt);
statInt++;
return statInt;
}
int main(void) {
myFunc(1);
myFunc(5);
myFunc(100);
return 0;
}
Выход:
Input:1 statInt:0
Input:5 statInt:1
Input:100 statInt:2
Обратите внимание, что использование статической переменной внутри функции имеет определенное и ограниченное число случаев, когда они являются полезными, и в целом не являются хорошей идеей для большинства проектов.
'const' не влияет на длительность хранения или связь, т.е. те же правила применяются к переменным' const' и non-'const' ... – Christoph
см. Также пример на http : //port70.net/~nsz/c/c99/n1256.html#6.9.2 о определениях файловой области ... – Christoph