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

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

например:

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) Если объявление идентификатора области файла для объекта или функция содержит спецификатор класса хранения static, идентификатор имеет внутренний связь

кроме того, переменная x имеет внешнюю связь, что означает имя x can доступен для других единиц перевода или по всей программе.

С99 (6.2.2/5) Если объявление идентификатора для объекта область файла и нет спецификатора класса хранения, его связь является внешней.


переменные, объявленные как static невозможно получить прямой доступ из других файлов. Напротив, не-static к ним можно получить доступ из других файлов, если они объявлены как extern в тех других файлах.

пример:

фу.c

int foodata;
static int foodata_private;

void foo()
{
    foodata = 1;
    foodata_private = 2;
}

фу.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.в Примере з).


C программы могут быть записаны в нескольких файлах, которые объединяются компоновщиком в окончательное выполнение. Если вся ваша программа находится в одном файле,то разницы нет. Но в реальном сложном программном обеспечении, которое включает использование библиотек функций в разных файлах, разница существенна.


переменной с областью файла видна только от точки объявления до конца файла. Файл ссылается на файл программы, содержащий исходный код. В большой программе может быть несколько программных файлов. Переменные с областью действия программы видны во всех файлах (не только в файле, в котором она определена), функциях и других блоках всей программы. Для получения дополнительной информации. проверьте это : область и классы хранения в C.