Статический против глобального
Если у меня есть файл 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не требуется в объявлении/определении функции. Его использование является избыточным.