Статический против глобального
Если у меня есть файл C, как показано ниже, в чем разница между i
и j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
5 ответов:
i
имеет внутреннюю связь, поэтому вы не можете использовать имяi
в других исходных файлах (строго единицы перевода) ссылаться на один и тот же объект.
j
имеет внешнюю связь, так что вы можете использоватьj
чтобы ссылаться на этот объект, если вы объявите егоextern
в другой единице перевода.
i
не видно за пределами модуля;j
доступна во всем мире.то есть другой модуль, который связан с ней, могу сделать
extern int j;
а затем иметь возможность читать и записывать значение в
j
. Тот же другой модуль не может получить доступi
, но может объявить свой собственный экземпляр, даже глобальный, который не виден первому модулю.
разница в том, что
i
имеет внутреннюю связь, иj
имеет внешние связи. Это означает, что вы можете получить доступj
из других файлов, с которыми вы связываетесь, тогда какi
доступен только в том файле, где он объявлен.
i
будет статическая линковка, т. е. переменная доступна только в текущем файле.
j
должно быть определено какextern
, что составляетextern int j;
в другом заголовочном файле (
.h
), и тогда у него будет внешняя связь, и могут быть доступны через файлы.
область статической переменной / функции находится в одном файле, несмотря на то, что вы включаете файл как часть другого исходного файла.
область действия глобальной переменной находится во всех файлах, в которые она включена. Чтобы включить переменную в другой исходный файл, мы используем
extern
перед объявлением переменной. В этом случае для переменной снова не выделяется память.
extern
используется для объявления переменной C без ее определения.extern
ключевое слово расширяет видимость переменных C и C функции. Поскольку функции видны через программу по умолчанию, использованиеextern
не требуется в объявлении/определении функции. Его использование является избыточным.