Областью действия имени является та часть программы, в которой это имя определено. Для автоматической переменной, описанной в начале функции, областью действия является та функция, в которой описано имя этой переменной, а переменные из разных функций, имеющие одинаковое имя, считаются не относящимися друг к другу. Это же справедливо и для аргументов функций.
Область действия внешней переменной простирается от точки, в которой она объявлена в исходном файле, до конца этого файла. Например, если val, sp, push, pop и clear определены в одном файле в порядке, указанном выше, а именно:
int sp = 0; double val[maxval];
double push(f) {...}
double pop() {...}
clear() {...}
то переменные val и sp можно использовать в push, pop и clear прямо по имени; никакие дополнительные описания не нужны.
С другой стороны, если нужно сослаться на внешнюю переменную до ее определения, или если такая переменная определена в файле, отличном от того, в котором она используется, то необходимо описание extern.
Важно различать описание внешней переменной и ее определение. описание указывает свойства переменной /ее тип, размер и т.д./; определение же вызывает еще и отведение памяти. Если вне какой бы то ни было функции появляются строчки
int sp; double val[maxval];
то они определяют внешние переменные sp и val, вызывают отведение памяти для них и служат в качестве описания для остальной части этого исходного файла. В то же время строчки
extern int sp; extern double val[];
описывают в остальной части этого исходного файла переменную sp как int, а val как массив типа double /размер которого указан в другом месте/, но не создают переменных и не отводят им места в памяти.
Во всех файлах, составляющих исходную программу, должно содержаться только одно определение внешней переменной; другие файлы могут содержать описания extern для доступа к ней. /описание extern может иметься и в том файле, где находится определение/. Любая инициализация внешней переменной проводится только в определении. В определении должны указываться размеры массивов, а в описании extern этого можно не делать.
Хотя подобная организация приведенной выше программы и маловероятна, но val и sp могли бы быть определены и инициализированы в одном файле, а функция push, pop и clear определены в другом. В этом случае для связи были бы необходимы следующие определения и описания: