796_______________________________Часть II. Программирование на C++

Объявления в строках 4 и 5 описывают беззнаковое длинное целое factorial и функцию Factorial как внешние для этого модуля. Сами переменная и функция определены в отдельном модуле (extern!.срр), приведенном на листинге 9.2.

h01961.jpg

1 // EXTERN2.CPP - Определения здесь

2 unsigned long factorial;

3 unsigned long Factorial( unsigned long num)

4 (

5 return num > 2 ? num * Factorial( num — 1) : num;

6 >

Замечание

Функция факториала считает произведение всех целых чисел от единицы до заданного числа включительно. Она делает это рекурсивна, что означает, что эта функция в процессе решения вызывает сама себя. Например, факториал числа 5 (пишется как 5!) вычисляется как 1*2*3*4*5=120.

Необходимость в спецификаторе extern для функций устраняется помещением функции в свой собственный модуль, вынесением объявления (или интерфейса) в заголовочный файл и включением этого файла в каждый использующий эту функцию модуль. Глобальных переменных в C++ следует по возможности избегать вообще.

У такого способа есть несколько преимуществ. Во-первых, гораздо проще включать в модуль заголовок с объявлениями, чем каждый раз вводить их заново. Во-вторых, объявления должны абсолютно точно совпадать. Вариант с заголовком уменьшает шансы ошибиться.

Объявление внешней компоновки С

C++ часто используется в качестве платформы для разработки инструментов, упрощающих доступ к возможностям других программных средств Windows. И здесь спецификатору extern нашлось применение — он используется для определения точек компоновки различных модулей — VBX, DDL и ОСХ — написанных на C++.

Средства разработки для Windows, например Delphi (базирующееся на Object Pascal) или Visual Basic, передают параметры (они же аргументы) иначе, чем это делается в C++ (не забывайте, что речь идет о программах для Windows).

Аргументы передаются функциям путем размещения их значений или адресов в сегменте стека. Затем они снимаются со стека, инициализируя значения параметров функций. BASIC и Pascal извлекают аргументы из стека в порядке их появления. С и C++ используют обратный порядок хранения в