Главная » C++, C++ Builder » Работа с IDEToMak в CBuilder

0

Если вы раньше использовали (или по-прежнему используете) компилятор  Borland  C++ (последняя версия 5.02), то вы, вероятно, захотите взять какие-нибудь существующие проекты и загрузить их в среду CBuilder. Зачем вам это нужно? Чтобы удобнее работать с окнами (формами), а также чтобы конвертировать библиотеки DLL в новые VCL, — вот уже две причины, которые первыми приходят на ум.

К сожалению, компилятор Borland C++ держит информацию о проекте в специальном файле с расширением IDE, и этот *.IDE файл не совместим с CBuilder. В конце концов, не станете же вы ожидать, что две разные версии разных языковых оболочек будут совместимы? Ну, в мире Windows, наверное, не станете, но вот в мире Borland — другое дело.

Программа IDEToMak конвертирует существующий IDE-файл проекта из Borland C++ в эквивалентный файл проекта (MAK) в системе CBuilder. Чтобы запустить программу IDEToMak, перейдите в каталог с IDE-файлом и введите:

IDEToMak <IDEFile>

Например, если у вас был проект в Borland C++, который назывался Test, то вы бы набрали:

IDEToMak Test.IDE

В результате получился бы файл Test.MAK в каталоге Test. У программы IDEToMak нет опций; это простая утилита, которая совершает прямое преобразование.

Использование  препроцессора

Как большинство компиляторов C++, Borland CBuilder поставляется с программой препроцессора. В CBuilder она называется CPP32.EXE. Препроцессор отвечает за замену всех директив препроцессора в полный исходный код приложения перед тем, как вызывается компилятор. Препроцессор работает с такими выражениями, как #include, #define, #ifdef и т. д. Представьте, например, что у вас был следующий исходный файл:

#ifdef WORKING int x = 1;

#else

int x = 2;

#endif

#define X_WORD 32 int main(void)

{

int z = X_WORD + 99;

// Здесь что-нибудь делаем с z return 0;

}

Это простое приложение использует несколько директив препроцессора (#ifdef, #else, #endif,

#define). Если бы вы пропустили приложение через препроцессор, набрав

C:\test>cpp32 test.cpp

Borland C++ Preprocessor 5.2 for Win32 Copyright (c) 1993, 1997 Borland International TEST.CPP:

то вы бы увидели, что результат записан в файл test.i. Вот как этот файл выглядит для данного исходного файла:

/* TEST.CPP 1: */

/* TEST.CPP 2: */

/* TEST.CPP 3: */

/* TEST.CPP 4: */int x = 2;

/* TEST.CPP 5: */

/* TEST.CPP 6: */

/* TEST.CPP 7: */

/* TEST.CPP 8: */

/* TEST.CPP 9: */int main(void)

/* TEST.CPP 10: */{

/* TEST.CPP 11: */int z = 32 + 99;

/* TEST.CPP 12: */

/* TEST.CPP 13: */

/* TEST.CPP 14: */

/* TEST.CPP 15: */return 0;

/* TEST.CPP 16: */

/* TEST.CPP 17: */}

/* TEST.CPP 18: */

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

#include <vector>

#ifdef WORKING int x = 1;

#else

int x = 2;

#endif

#define X_WORD 32 vector<int> intArray; int main(void)

{

int z = X_WORD + 99;

// Здесь что-нибудь делаем с z return 0;

}

Опять же, здесь нет ничего особенного. Мы просто добавили модуль из библиотеки стандартных шаблонов (STL), но вы, вероятно, будете очень удивлены, как и я, когда увидите, что размер получившегося файла test.i превышает 6 Mбайт. Это, в частности, показывает, почему компиляция программы, использующей STL, происходит намного дольше, чем компиляция программы, не использующей эту библиотеку. Просмотр полученного файла может занять несколько дней. Приятным моментом во всем  этом  является то,  что препроцессор генерирует такой файл всего секунд за 30, а компилятор обрабатывает его ненамного дольше (может быть, чуть меньше минуты), целиком компилируя весь текст в полностью работающую программу.

Один из самых важных случаев, когда используется препроцессор, — выяснение того, почему что-

то не работает, хотя, вроде бы, присутствует в коде. Если, к примеру,  у вас  два  определения одного и того же макроса (#define) находятся где-то среди многочисленных заголовочных файлов вашего приложения, то вы сможете найти их с помощью препроцессора. Если вы удалите кусок кода командой препроцессора #ifdef, то точно так же сможете понять, что происходит, посмотрев на то, что вам выдаст препроцессор.

Так как размер выходного файла препроцессора весьма велик, его стоит использовать только по сугубой необходимости. Но в любом случае приятно осознавать, что такая возможность есть.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии