В чем разница между "Область файла" и "область программы",
Сообщается, что переменная, объявленная глобально, имеет область программы
Говорят, что переменная, объявленная глобально со статическим ключевым словом, имеет область файла.
Например:
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;
}
В чем разница между этими двумя?
Ответы
Ответ 1
В C99 ничего не называется "область программы". В вашем примере переменная x
имеет область действия файла, которая заканчивается в конце единицы перевода. Переменные y
и z
, объявленные static
, также имеют область действия файла, но с внутренней связью.
C99 (6.2.2/3) Если объявление идентификатора области файла для объекта или функция содержит спецификатор класса хранения static, идентификатор имеет внутреннюю связь
Кроме того, переменная x
имеет внешнюю связь, которая означает, что имя x
can доступно для других единиц перевода или во всей программе.
C99 (6.2.2/5) Если объявление идентификатора для объекта имеет файловой области и спецификатора класса хранения, ее связь внешняя.
Ответ 2
Переменные, объявленные как 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 в примере).
Ответ 3
Программы C могут быть записаны в нескольких файлах, которые объединены компоновщиком в окончательное исполнение. Если вся ваша программа находится в одном файле, то нет никакой разницы. Но в реальном комплексном программном обеспечении, которое включает в себя использование библиотек функций в отдельных файлах, разница значительна.
Ответ 4
Переменная с файловой областью видима только с ее точки объявления до конца файла. Файл относится к программному файлу, содержащему исходный код. В большой программе может быть более одного файла программы.
Переменные с областью программы видны во всех файлах (не только в файле, в котором он определен), функциях и других блоках во всей программе.
Для получения дополнительной информации. проверьте это: Области области и хранилища в C.