Можем ли мы действительно ограничить область действия глобальной переменной с помощью Static?

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

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

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

O/P is 0

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


person Amit Singh Tomar    schedule 12.08.2011    source источник
comment
Вы сомневаетесь в собственном ответе ?? ссылка < / а>   -  person cyber_raj    schedule 12.08.2011


Ответы (4)


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

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

person hamstergene    schedule 12.08.2011
comment
Звучит неплохо !! но все же в file2.c я должен включить file2.h ?? - person Amit Singh Tomar; 12.08.2011
comment
Думайте о #include как о копировании и вставке содержимого файла. Если вы включите file.h в file1.c и file2.c, у них обоих будет объявление a, но это будут две разные переменные: изменение одной не изменит другую. - person hamstergene; 12.08.2011
comment
@ Амит Сингх Томар: Не приведет ли включение file2.h в file2.c к тому же сценарию, что и у вас сейчас? - person Alok Save; 12.08.2011

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

person Kerrek SB    schedule 12.08.2011

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

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

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

Для проверки сценария необходимо сделать следующее:

//file1.c 

static int i = 10;

//file2.c

extern int i;

int main()
{
    int a = i;
    return 0;   
}
person Alok Save    schedule 12.08.2011

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

person Patrick B.    schedule 12.08.2011