внешний и глобальный в с - PullRequest
       10

внешний и глобальный в с

2 голосов
/ 16 апреля 2010

Может кто-нибудь сказать, есть ли какие-то особые требования для использования переменных EXTERN или GLOBAL в программе на Си? Я не вижу никакой разницы в программе, как показано ниже, если я перейду с gloabl на extern.

#include <stdio.h>
#include <stdlib.h>
int myGlobalvar = 10;

int main(int argc, char *argv[])
{
  int myFunc(int);
  int i;
  i = 12;
  myGlobalvar = 100;
  printf("Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  i = myFunc(10);
  printf("Value of passed value : %d\n",i);
  printf("again Value of myGlobalvar is %d ,  i = %d\n", myGlobalvar, i);
  system("PAUSE");  
  return 0;
}
int myFunc(int i)
{
    i = 20 + 1000;
//extern int myGlobalvar;
myGlobalvar = 20000;
//    printf("Value of passed value : %d",i);
return i;
}

Если раскомментировать extern int myGlobalvar, значение не изменится.

Есть ли correct разница между ними?

Может кто-нибудь поправить меня?

Ответы [ 4 ]

21 голосов
/ 16 апреля 2010

Ключевое слово extern означает «хранилище для этой переменной выделено в другом месте». Он говорит компилятору: «Я ссылаюсь на myGlobalvar здесь, и вы не видели его раньше, но это нормально; компоновщик будет знать, о чем вы говорите». В вашем конкретном примере это не особенно полезно, потому что компилятор знает о myGlobalvar - он определен ранее в той же единице перевода (.c или .cc файл.) Обычно вы используете extern когда вы хотите сослаться на что-то, что не в текущей единице перевода, например переменную, определенную в библиотеке, с которой вы будете ссылаться.

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

6 голосов
/ 16 апреля 2010

С Здесь :

Глобальная переменная в C / C ++ - это переменная, доступ к которой можно получить из любого модуля в вашей программе.

int myGlobalVariable;

Это выделяет хранилище для данных и сообщает компилятору, что вы хотите получить доступ к этому хранилищу с именем «myGlobalVariable».

Но что вы будете делать, если хотите получить доступ к этой переменной из другого модуля в программе? Вы не можете использовать тот же оператор, что и выше, потому что тогда у вас будет 2 переменные с именем «myGlobalVariable», и это недопустимо. Таким образом, решение состоит в том, чтобы позволить другим модулям ОБЪЯВЛЯТЬ переменную без ее ОПРЕДЕЛЕНИЯ:

extern int myGlobalVariable;

Это говорит компилятору "есть переменная, определенная в другом модуле myGlobalVariable, типа integer. Я хочу, чтобы вы принимали мои попытки доступа к нему, но не выделяйте для него память, потому что другой модуль уже сделал это".

2 голосов
/ 16 апреля 2010

Поскольку myGlobalvar было defined до , функция myFunc. Его declaration внутри функции является избыточным.

Но если definition было после функции, мы должны иметь declaration.

int myFunc(int i)
{
    i = 20 + 1000;
    extern int myGlobalvar; // Declaration must now.
    myGlobalvar = 20000;
    printf("Value of passed value : %d",i);
    return i;
}

int myGlobalvar = 10; // Def after the function.
1 голос
/ 16 апреля 2010

myGlobalVar, как вы определили, это глобальная переменная, видимая из всех мест вашей программы Нет необходимости объявлять его extern в том же файле .c. Это полезно для других .c файлов, чтобы компилятор знал, что эта переменная будет использоваться.

...