Внешняя переменнаяпеременная, которая определяется извне функции. Она доступна всем функциям, определенным далее в файле. В отличии от автоматической переменной, внешняя по умолчанию имеет нулевое значение. Элементы внешнего массива инициализируются нулевыми значениями.
Преимущество внешних переменных в том, что, в отличие от автоматических переменных, к ним можно обратиться из более чем одной функции. При использовании внешних переменных программа работает быстрее, чем при передаче в функцию длинного списка параметров. В дополнение к этому, внешние переменные обеспечивают способ разделения данных между функциями, не вызывающими друг друга.
Тем не менее, не все переменные могут быть сделаны внешними. Для улучшения структуры программы и повышения ее читаемости лучше сделать переменную автоматической, если она используется только внутри функции или блока. Кроме того, поскольку внешние переменные доступны всем функциям, требуется предпринимать усилия, чтобы избежать конфликтующих изменений значений этих переменных.
Подобно другим идентификаторам, имена внешних переменных могут содержать буквы, цифры и символ подчеркивания, но не могут начинаться с цифры. Количество значащих символов в имени внешней переменной, зависит от системы.
Примечание 1
Некоторые компиляторы не делают различий между строчными и прописными буквами во внешних идентификаторах. Рекомендуется использовать строчные буквы.
Пример 1
int status;            /*Внешние переменные, доступные*/
char systname[20];     /*всем функциям, расположенным ниже*/

void fillbuf(void), emptybuf(void);
int main()
{
  fillbuf();
  ...
  emptybuf();
  ...
}
char buf[1024];         /*Внешняя переменная, доступная*/
void fillbuf(void)      /*функциям fillbuf и emptybuf*/
{
  ...
}
void emptybuf(void)
{
 ...
}
Множественные исходные файлы
Программы на языке Си часто располагаются в нескольких исходных файлах. Одним из примеров является операционная система UNIX, исходные файлы которой функционально структурированы. Существуют файлы, содержащие программы драйверов устройств, управления процессами, файловой системой и т.д. Использование нескольких исходных файлов ускоряет редактирование, компиляцию и отладку. Оно облегчает структуризацию программы и организацию коллективной работы.
Для внешних переменных существует отличие между определением и объявлением.
Внешнее определение переменной (например, int status;) выделяет область памяти под переменную.
Внешнее объявление переменной (например, external int status;) памяти не выделяет, оно информирует компилятор о том, что переменная определена где-то еще. Это предотвращает выдачу сообщения об ошибке "неопределенный идентификатор" при использование переменной в файле, в котором она неопределена.
Для функции объявление класса external не требуется, так как имя функция всегда определено как внешний идентификатор.
Пример 2
/* Файл one.c */

int status;               /*определения внешних*/
char sysname[20];             /*переменных*/
void fillbuf(void);

main ()
{
    fillbuf();
    . . .
    if (...)
       emptybuf();
}

/* Файл two.c */

external int status;       /*объявления внешних*/
external char sysname[20];    /*переменных*/
char buf[1024];            /*определение внешней переменной*/
void emptybuf(void);
void fillbuf(void)
{
    . . .
}
void emptybuf(void)
{
  fillbuf();
}

Для создания выполнимого файла программы надо выполнить совместную компиляцию этих двух файлов, используя, например, следующую команду операционной системы UNIX:
$ cc one.c two.c