Можем ли мы действительно ограничить область действия глобальной переменной, используя Static? - PullRequest
1 голос
/ 12 августа 2011

Я где-то читал, что мы можем ограничить область действия глобальной переменной только файлом используя статическое ключевое слово перед именем переменной. Но когда я попробовал это на практике, это оказалось ложным:

//1st file - file1.c                   //2nd file - file2.h
#include<file2.h>                      static int a;
main()                                
{
    fun();                                 
}                                                                                 

fun()
{
    printf("%d",a);
}   

O / P равно 0

Теперь у нас есть глобальная переменная a , которая объявлена ​​в file2.h, область действия которой ограничена только этим файлом.
С тех пор мы объявили его как статический, но все же мы можем получить доступ к этой переменной в file1.c. Как ??

Ответы [ 4 ]

2 голосов
/ 12 августа 2011

In ограничивает область видимости глобальной переменной выражением file , для file они означают единицу компиляции , то есть файл .c.Ваш file2.h включен в file1.c, и они составляют одну единицу компиляции file1.

Переместите переменную во вторую единицу компиляции, например file2.c, и вы увидите, что не можете получить к ней доступдаже с extern декларацией.

2 голосов
/ 12 августа 2011

Область действия не ограничивается файлом , но единицей перевода . Поскольку вы включаете file2.h в file1.c, это все один TU - вы могли бы также вставить содержимое file2.h в исходный файл.

1 голос
/ 12 августа 2011

Вы включаете файл file2.h, в котором вы объявили переменную как статическую в файле c, который имеет main, что так же хорошо, как и запись объявления в этом файле c.

Когда вы включаетефайл заголовка, который объявляет статическую переменную, копия переменной создается для каждой единицы перевода (c file + включенные файлы заголовка), в которую включен файл заголовка.

Никогда не объявляйте ваши статические переменные в заголовочном файле.

Чтобы проверить сценарий, вы должны сделать следующее:

//file1.c 

static int i = 10;

//file2.c

extern int i;

int main()
{
    int a = i;
    return 0;   
}
0 голосов
/ 12 августа 2011

Область действия определяется после запуска препроцессора С.То есть: после того, как все # include-операторы были оценены и встроены.

...