Статический против глобального


Если у меня есть файл C, как показано ниже, в чем разница между i и j?

#include <stdio.h>
#include <stdlib.h>

static int i;
int j;

int main ()
{
    //Some implementation
}
5 52

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