Подтвердить что ты не робот

В чем разница между "Область файла" и "область программы",

Сообщается, что переменная, объявленная глобально, имеет область программы  Говорят, что переменная, объявленная глобально со статическим ключевым словом, имеет область файла.

Например:

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;  
}  

В чем разница между этими двумя?

4b9b3361

Ответ 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.