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

пока еще не исполняемый код) созданы, вызывается компоновщик для увязки разных вещей типа вызовов функций и их возвращаемых значений.

Все эти нюансы не сложны для понимания, но требуют некоторых пояснений. Во-первых, компилятор, который не есть компоновщик, в основном создает условные имена для различных программных объектов и назначает им адреса. После компоновки кода вызовы осуществляются не по именам, а по адресам. Объектные файлы, содержащие отсутствующий в вашей программе код, могут быть собраны в коллекции, называемые библиотечными (.lib) файлами. Адресные ссылки разрешаются компоновщиком в обоих случаях совершенно одинаково.

Во-вторых, полученный в результате компоновки файл \не обязан иметь расширение .ехе, как этого можно ожидать от программного файла. Вы можете создавать также динамически подключаемые библиотеки (DLL); это могут быть также драйверы устройств, обычно имеющие расширение .sys или .bin. Драйверы устройств требуют некоторых специальных знаний об операционной системе и обычно загружаются в файле Config.sys, например:

device=c:\mydriver.sys

Объявляя функцию winMain, вы скомпилируете исполняемую программу Windows, a LibMain — библиотеку DLL. Короче говоря, имеется ряд файлов, которые компилируются, потом компонуются, но окончательный результат не обязан иметь расширение .ехе (не забудьте еще файлы с расширением corn).

Реализация С с классами

2 помощью препроцессора создавался первоначальный вариант языка C++, жорее даже его предшественник, известный как С с классами. Бьерн ^трауструп в своих книгах Annotated Reference Manual (ARM, Аннотированное справочное руководство) и The C++ Programming Language (Язык про-'раммирования C++) уверяет, что С с классами был чем-то большим, чем пзепроцессорным трюком и не ограничивался простой заменой ключевых ;лов. Но так или иначе, роль препроцессора в его реализации нельзя недо-щенивать.

Несложно представить себе, например, как с помощью препроцессора мож-[о имитировать конструкции в стиле языка PASCAL:

define begin { define end }

'ак же без особого напряжения можно изобразить что-то похожее и на >Ь+. Сейчас уже сложно точно выяснить, какое именно участие препроцес-ор принял в появлении на свет С с классами, да и интерес это имеет боль-ie исторический, нежели практический. Препроцессорная реализация С с