Статический против глобального - PullRequest
61 голосов
/ 16 февраля 2010

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

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

static int i;
int j;

int main ()
{
    //Some implementation
}

Ответы [ 5 ]

57 голосов
/ 16 февраля 2010

i имеет внутреннюю связь, поэтому вы не можете использовать имя i в других исходных файлах (строго в единицах перевода) для ссылки на тот же объект.

j имеет внешнюю связь, поэтому вы можете использовать j для ссылки на этот объект, если вы объявите его extern в другой единице перевода.

19 голосов
/ 16 февраля 2010

i не видно снаружи модуля; j доступен по всему миру.

То есть другой модуль, связанный с ним, может

extern int j;

, а затем сможете прочитать и записать значение в j. Тот же другой модуль не может получить доступ к i, но может объявить свой собственный экземпляр, даже глобальный, который невидим для первого модуля.

4 голосов
/ 16 февраля 2010

Разница в том, что i имеет внутреннюю связь, а j имеет внешнюю связь. Это означает, что вы можете получить доступ к j из других файлов, с которыми вы связываетесь, тогда как i доступен только в файле, где он объявлен.

3 голосов
/ 16 февраля 2010

i будет иметь статическую связь , т. Е. Переменная доступна только в текущем файле.

j должно быть определено как extern, то есть

extern int j;

в другом заголовочном файле (.h), и тогда он будет иметь внешнюю связь и доступен для всех файлов.

1 голос
/ 07 апреля 2018

Область действия статической переменной / функции находится в одном и том же файле, несмотря на то, что вы включаете файл как часть другого исходного файла.

Область действия глобальной переменной распространяется на все файлы, в которые она включена. Чтобы включить переменную в другой исходный файл, мы используем extern перед объявлением переменной. В этом случае для переменной снова не выделяется память.

extern используется для объявления переменной C без ее определения. Ключевое слово extern расширяет видимость переменных C и функций C. Поскольку функции видны во всей программе по умолчанию, использование extern не требуется в объявлении / определении функции. Его использование является излишним.

...