внешние переменные в C и их область действия - PullRequest
1 голос
/ 20 января 2012

Я пытаюсь понять этот код:

#include<stdio.h>
int main()
{
  extern int a;
  printf("%d\n", a);
  return 0;
}
int a=20;

Когда я запускаю его, значение a равно 20. Но это должно быть невозможно, так как глобальная переменная a определена внизу.

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Объявление extern может использоваться только с глобальными переменными. Он сообщает компилятору, что глобальная переменная определена в другом месте, и просит компоновщика выяснить это.

В вашем коде extern int a относится к a, определенному внизу вашего примера. Он мог бы быть одинаково хорошо определен в другой единице перевода.

Как уже отмечали другие, инициализация a происходит до ввода main().

2 голосов
/ 20 января 2012

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

1 голос
/ 20 января 2012

Инициализация глобальных переменных происходит до вызова main().

Таким образом, даже если инициализация a = 20 расположена ниже реализации main(), она всегда выполняется первой, поэтому ее можно использовать при запуске программы (при условии, что вы правильно объявили переменную в областях, где она будет использоваться с использованием extern int a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...