Трансляция кода Delphi в код C++BuilderИсточник: winapi Куковинец А.В
Цель этой статьи состоит в том, чтобы помочь вам понять основные различия и подобия между C++ и Object Pascal (язык, используемый в Delphi от Borland), и помочь вам в преобразовании проекта написанного на Delphi в проект написанный на C++ (С++Builder от Borland).В жалбнейшем в этой статье вместо терминов Object Pascal и Delphi будет употребляться аббревиатура "OP".
Следует отметить, что язык С++ является регистро зависимым, в отличие от OP , который таковым не является.
C++ Объявление переменных OP // ... какойто код ... C++ Для обработки строк имеется ряд библиотечных функций. Основные из них strcat - конкатенация (склеивание) двух строк, strcmp - сравнение двух строк, strcpy - копирование одной строки в другую, strstr - поиск в строке заданной подстроки, strlen - определение длины строки, strupr - преобразование символов строки к верхнему регистру, sprintf - построение строки по заданной строке форматирования и списку аргументов и ряд других функций. OP Delphi поддерживает строки практически неограниченной длины (до 2 Гб), в дополнение к 255-символьным строкам, известным как pascal-строки. Новая директива компилятора $Н позволяет контролировать смысл использования зарезервированного слова string. Состояние этой директивы по умолчанию ($Н+) подразумевает использование в качестве типа string длинных строк. $Н- подразумевает использование коротких 255-символьных pascal-строк. Все компоненты Delphi используют длинные строки.Следует отметить, что, вне зависимости от состояния директивы $Н, если специфирована максимальная длина строки, меньшая 255, то подразумевается короткая строка (ShortString). Назначение длины строки с использованием квадратных скобок всегда подразумевает подтип ShortString. Длинные строки, введенные в Delphi 2.0, в большинстве случаев совместимы со строками старого типа. При этом необходимо принимать во внимание следующие особенности их использования:
Поскольку реально длинные строки не дублируются, а для них поддерживаются счетчики использований, то присваивание длинных строк происходит намного быстрее по сравнению с короткими строками.Несмотря на то, что большая часть кода, используемого при работе со строками интероперабельно для коротких и длинных строк (то есть применимо к обоим видам строк), тем не менее, некоторые операции над короткими строками не применимы к длинным строкам. Длинные строки не могут передаваться в параметры типа OpenString или как var-параметры, соответствующие коротким строкам. Массивы Массивы - упорядоченные последовательности одного типа данных (могут включать также и объекты). Методы для объявления массива в C ++ и OP - различные. С++ OP var ArrayS: array[1..31] of double; Оба языка поддерживают многомерные массивы С++ double dMatrix[50] [20]; OP dMatrix: array[1..50, 1..20] of double; Приравнивание и сравнение переменных C++ Сравнение производиттся оператором "двойное равно" (==), приравнивание одним равно (=) int i,j; OP Сравнение производиттся оператором "равно" (=), приравнивание двоеточие+одно равно (:=) ... Константы - значения, которые не изменяются . Идентификатор может быть объявлен как константа, и в C ++ и OP. И C ++ и OP константам должны быть назначены значения при их объявлении. С++ При объявлении константы перед типом данных используется ключевое слово const В С++ константы также можно определять через директиву препроцессора #define но на практике это устарело. Так как компилятор не может выполнить контроля соответствия типов(он не может определить что это ini или double) OP Константы, подобно переменным, должны быть объявлены в блоке кода "const" в начале определения процедуры или функции ,определения или в декларации объекта . function PayBack_d(var dAmount: double): double; Блоки Кода, которые исполняют определенную задачу в C ++, называются "функциями" независимо от того, действительно ли они возвращают значение. В OP, функции должны возвращать значение, процедуры не возвращают значение. В C ++, все функции должны иметь прототип, объявленный перед применением (так что транслятор может сравнивать обе функции , чтобы гарантировать соответствие). В OP, однако, функция или определение процедуры могут опустить (но это не желательно) параметры и опускать тип возвращения.Декларация функции в C ++ и определений требует фигурных скобок () независимо от того, действительно ли передаются любые параметры. OP функции и процедуры не нуждаются в фигурных скобках () при их объявлении или определении , если не передается никаких параметров,для вызова функции или процедуры. С++ Реализация OP Каждая функция и процедура должны быть идентифицированы включением ключевого слова "function" или "procedure" в начале каждого определения . procedure LoanC.SetNewIntRate; И C ++ и OP могут передавать параметры по значению или по ссылке или передавать константы... C++ по значению ... double IntSinceLastAddDate_d(double dAvailCash); C++ по ссылке ... double IntSinceLastAddDate_d(double &dAvailCash); C++ константы... double IntSinceLastAddDate_d(const double dAvailCash); Вообще, C ++ более компактен чем OP. Но, C ++ не имеет инструкцию with ... do с... Это неудачно, потому что это действительно - большая особенность OP. C ++ код будет более подробным по сравнению с OP. В C ++, когда Вы должны обратиться к членам данных, вы заканчиваете оператор подобно этому... Но в OP, Вы можете делать это гораздо менее читаемым, делая так... Комментарии OP в отличие от С++ поддерживает 3 вида комментариев. Это связано с тем, что Borland при написании Delphi внес в язык Pascal очень много элементов из C++.В часности добавился однострочный комментарий как в С++ Управляющие конструкции (if, else, switch...) Существует пять структур управления на обоих языках, и они весьма подобны. Этот обзор займет много места . 1. Конструкция if ... else C++ if(<логическое выражение>) // в скобках единственное выражение { ... } else if(<логическое выражение>) { ... } else { ... } OP if <логическое выражение> then begin {единственное выражение не должно находиться в скобках} ... end else if <логическое выражение> then begin .... end else begin ... end; {только самый последний "end" в выражении терминируется точкой с запятой} 2. Конструкция switch/case C++ switch(<целочисленная константа>) { case iX: ... break; case iY: ... break; default: ... } OP case <целочисленная выражение переменная или константа> of {здесь "begin" не нужен} iX: begin ... end; {точка с запятой после каждого "end";} iY: begin ... end; else {двоеточие не требуется} begin ... end; end;{вот здесь "end;" } 3. Цикл for C++ for(iCount = 0; iCount <= 10; iCount++) { // инкреметн нужен для цикла, iCount++,может быть увеличен // на любое значние не только на 1 ... break; // для выхода из цикла continue; // для продолжения цикла ... } OP for iCount := 1 to 10 do begin ... {цикл for может увеличивать счетчик только на 1} break; { для выхода из цикла } continue; { для продолжения цикла } ... end ; Есть одно различие между выполнением "break" и "continue" в языках. В C ++, break, и continue - ключевые слова - часть языка; В OP это библиотечные процедуры.Хотя используются также. 4. Цикл while C++ while(<логическое выражение>) { // выражение проверяется в самом начале цикла,так что код может никогда не использоваться // если выражение вернет false ... break; // для выхода из цикла continue; // для продолжения цикла ... } OP while <логическое выражение> do begin { выражение проверяется в самом начале цикла,так что код может никогда не использоваться если выражение вернет false } ... break; { для выхода из цикла } continue; { для продолжения цикла } ... end; 5. Цикл do ... while 5) The do/repeat ... loop construct: C++ do { // выполняется некий код, затем проверяется выражение. В этом случае код выполнится хотябы один раз ... break; // для выхода из цикла continue; // для продолжения цикла ... }while(<логическое выражение>); OP repeat { eвыполняется некий код, затем проверяется выражение. В этом случае код выполнится хотябы один раз заметьте что в цикле нет ключевых слов begin ... end } ... break; { для выхода из цикла } continue; { для продолжения цикла } ... until <логическое выражение>; |