Внешняя переменная должна быть определена, причем только один раз, вне текста любой функции. В этом случае ей будет выделена память. Она должна быть описана (декларирована) во всех функциях, которые хотят ею пользоваться. Описание содержит сведения о типе переменной. Описание может быть явным, в виде инструкции extern, или неявным, когда нужная информация получается из контекста.
Правило! Если переменная описана в другом модуле, применение ключевого слова extern в ее описании обязательно. Если определение внешней переменной в исходном файле расположено выше функции, где она используется, то в описании extern нет необходимости.
Модуль А:
…
int e_name;
extern double mult, coef[]; //Можно не указывать размер массива
int funcA0()
{ … // e_name, mult, coef[]
}
int main()
{ …
}
Модуль B:
…
extern int e_name;
double mult, bound;
int funcB0()
{ … // e_name, mult, bound
}
…
Модуль C:
…
extern int e_name;
extern double mult;
double coef[10];
int funcC0()
{ … // e_name, mult, coef[10]
}
Отметим, что в случае совпадения имен внутренней и внешней переменной какой-то функции, в данной функции будет использоваться внутренняя переменная, т. е.:
int e_name;
int funcA0();
int funcA0()
{ int e_name = 11;
printf (“\nfuncA0: e_name = %d”, e_name);
}
int main()
{ …
e_name = 77;
…
funcA0();
…
printf (“\nmain: e_name = %d”, e_name);
}
В результате:
funcA0: e_name = 11
main: e_name = 77
Поскольку внешние переменные доступны всюду, их можно использовать в качестве связующих данных между функциями как альтернативы связей через аргументы и возвращаемые значения. Для любой функции внешняя переменная доступна по ее имени, если только это имя было должным образом описано.