Отличия Free Pascal от Турбо7 и Делфи7. Перенос исходников Турбо, Делфи во Free Pascal
Рекомендации по компиляции проектов Делфи7 в FPC
см. здесь.
--- Конструкции Turbo 7, не поддерживаемые FPC: ---
0.Duplicate case labels are not allowed. This is a bug in Turbo Pascal and will not be
changed.
1. Список параметров процедур/функций FPC должен точно соответствовать предварительному
определению. Чтобы снять это ограничение, используйте директиву компилятора -M
2. Переменные MEM, MEMW, MEML и PORT Турбо ПАскаля для прямого доступа к памяти и портам
- отсутствуют в FPC
3. В список зарезервированных слов FPC добавлены (относительно Турбо): PROTECTED, PUBLIC,
PUBLISHED, TRY, FINALLY, EXCEPT, RAISE, т е нельзя использовать в качестве идентификаторов.
Чтобы избавиться от этого - ключ -Mtp
4. Зарезервированные слова FAR, NEAR (Турбо7) игнорируются , устарели.
5. INTERRUPT будет работать только в программах, предназначенных для работы в DOS.
6. По умолчанию, компилятор FPC использует синтаксис AT and T, однако другие ассемблерные
формы тоже доступны. Подробнее см руководство программиста.
7. Turbo Vision доступен под именем FreeVision который должен иметь почти 100%
совместимость с Turbo Vision.
8. Не доступен модуль Overlay
9. FPC имеет больше зарезервированных слов.
10. При запуске из командной строки параметры FPC отличаются от Турбо7
11. Ключи и директивы компиляторов FPC и Турбо7 в основном совпадают, но есть отличия.
12. Компилированные модули (в бинарном виде) FPC и Турбо7 не совместимы
13. Структура TextRec (в бинарном виде) FPC и Турбо7 не совместима.
14. Множества Free Pascal всегда занимают 4 байта, поэтому некоторые преобразования типов,
возможные в Турбо7 недоступны в FPC.
15. Файлы, открытые Rewrite, в FPC доступны ТОЛЬКО для записи. Чтобы из них читать,
используйте Reset
16. Деструкторы не могут иметь параметров. Это ограничение можно преодолеть,
используя ключ -So
17. Порядок операций при вычислении выражений - иной. Например, не гарантируется,
что в выражении a:= g(2) + f(3); g(2) будет вычислено прежде чем f(3).
---- Что возможно в Free Pascal, но не возможно в Турбо7: ----
1. Функции могут возвращать результаты структурированных типов, например записи массивы.
2. Можно использовать имя функции в теле функции (например, так):
function a : longint;
begin
a:=12;
while a>4 do
begin
{...}
end;
end;
В этом примере нет рекурсии. Чтобы вызвать функцию во Free Pascal рекурсивно, используйте
скобки (), например:
function a : longint;
begin
a:=12;
while a()>4 do
begin
{...}
end;
end;
3. Free Pascal частично поддерживает Делфи-конструкции (см руководство программиста)
4. Вызов exit для функций допускает возврат значений, например:
function a : longint;
begin
a:=12;
if a>4 then
begin
exit(a*67); {Возвращает a*67 }
end;
end;
5. Free Pascal поддерживает перегрузку функций, т е можно определить несколько функций
с одним именем, но различным списком параметров. Напримеsр:
procedure DoSomething (a : longint);
begin
{...}
end;
procedure DoSomething (a : real);
begin
{...}
end;
Чтобы не было перегрузки при использовании директивы forward, оба заголовка должны быть
полностью идентичны !
6. Free Pascal поддерживает перегрузку операций, например, можно определить + для матриц.
7. Free Pascal поддерживает длинные имена файлов в FAT16 и FAT32.
----------- Перенос исходников Delphi7 -------------
1. Чтобы максимально приблизить FPC к Delphi7, используйте -Mdelphi в командной строке
или вставляйте в исходники (перед Unit и Program ) такой код:
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF FPC}
2. Конструкции, добавленные в Делфи после версии 7, не поддерживаются FPC.
3. FPC компилирует бОльшую часть FreeCLX и Widget.
4. Версия 2.0.4 FPC не поддерживает следующие конструкции Д7:
- интерфейс Dispinterface,
- делегирование интерфейсов,
- динамические методы идентичны виртуальным,
- Reintroduce,
- параметры процедур, объявленные как Const, не обязательно передаются посредством ссылок.
- Packages
5. Не поддерживаются некоторые конструкции ассемблера
6. Отметим, что -Mobjfpc ключ вводит ограничения более строгие, чем Делфи, а именно:
- Имена параметров и локальных переменных методов не должны совпадать с именами
свойств (этого) класса.
- для присваивания значений переменным процедурного типа и обработчикам событий
необходим адресный оператор (@)
- AnsiString и String не тождественны по умолчанию.
7. По умолчанию FPC создает консольное приложение. Если требуется создать приложение
с графическим интерфейсом (GUI) - нужно вставить директиву
{$APPTYPE GUI}
8. Модуль Windows обеспечивает интерфейс к большинству функций Win32 API.
Однако в списке параметров вызова возможна замена параметра-переменной на указатель.
9. Управление Widestrings не автоматизировано в Free Pascal. FPC поддерживает Widestrings,
однако может использовать кодировку, отличную от принятой в Windows.
10. Потоки: (в смысле - нити). В настоящей версии (2.0.4) Free Pascal не предлагает
собственной поддержки потоков: В Unix требуется связь с библиотекой С для поддержки
потоков в приложениях FPC. То есть нужно подключить модуль cthreads для использования
потоков.
11. Вызов SetLastOSError не поддерживается (и не будет никогда)
12. Free Pascal обеспечивает регистронезависимость имен файлов поиском версии файла
в нижнем регистре (строчные буквы)
13. RTTI хранится иначе, чем в Делфи. Формат в основном совместимый, но может отличаться.
Это не должно быть проблемой, если используется модуль TypeInfo и нет попыток
прямого доступа к информации RTTI.
14. Размер множеств иной, чем в Делфи.
15. Размер перечисляемых типов иной, чем в Делфи.
16. Внутренняя структура структурированных данных (записи, объекты, классы) не
документируется. Не рекомендуется делать предположения о структуре.
17. Это справедливо и для основных типов. Так, расположение старшего и младшего байтов
слова для различных процессоров может отличаться.
18. Для устранения противоречий Делфи-FPC рекомендуется вместо использования директив
IFDEF создавать специальные модули, которые используются только при компиляции в FPC