В чем разница между "областью действия файла" и "областью действия программы"
Говорят, что переменная, объявленная глобально, имеет область видимости программы
Считается, что переменная, объявленная глобально со статическим ключевым словом, имеет область видимости файла.
Например:
int x = 0; // **program scope**
static int y = 0; // **file scope**
static float z = 0.0; // **file scope**
int main()
{
int i; /* block scope */
/* .
.
.
*/
return 0;
}
В чем разница между этими двумя?
4 ответа
В C99 нет ничего под названием "область действия программы". В вашем примере переменная x
имеет объем файла, который заканчивается в конце блока перевода. переменные y
а также z
которые объявлены static
также есть область видимости файла, но с внутренней связью.
C99 (6.2.2 / 3) Если объявление идентификатора области файла для объекта или функции содержит статический спецификатор класса хранения, идентификатор имеет внутреннюю связь
Кроме того, переменная x
имеет внешнюю связь, которая означает имя x
Может быть доступен для других единиц перевода или по всей программе.
C99 (6.2.2 / 5) Если объявление идентификатора для объекта имеет область действия файла и не имеет спецификатора класса хранения, его связь является внешней.
Переменные, объявленные как static
невозможно получить прямой доступ из других файлов. Наоборот, неstatic
к ним можно получить доступ из других файлов, если они объявлены как extern
в этих других файлах.
Пример:
foo.c
int foodata;
static int foodata_private;
void foo()
{
foodata = 1;
foodata_private = 2;
}
foo.h
void foo();
main.c
#include "foo.h"
#include <stdio.h>
int main()
{
extern int foodata; /* OK */
extern int foodata_private; /* error, won't compile */
foo();
printf("%d\n", foodata); /* OK */
return 0;
}
Как правило, следует избегать глобальных переменных. Однако в реальных приложениях они часто полезны. Распространено extern int foo;
объявления в общий заголовочный файл (в примере foo.h).
Программы на C могут быть записаны в несколько файлов, которые объединяются компоновщиком в окончательном исполнении. Если вся ваша программа находится в одном файле, то нет никакой разницы. Но в реальном сложном программном обеспечении, которое включает использование библиотек функций в отдельных файлах, разница значительна.
Переменная с областью видимости файла видна только от точки ее объявления до конца файла. Файл ссылается на файл программы, который содержит исходный код. В большой программе может быть несколько программных файлов. Переменные с областью действия программы видны во всех файлах (не только в файле, в котором он определен), функциях и других блоках во всей программе. Для дальнейшей информации. проверьте это: Scope и Storage Classes в C.