Условная компиляция

Можно ли во время компиляции определить платформу и компилятор, например {$IFDEF FPC} … {$IFDEF MSWINDOWS}? Спасибо. Удачи !

Вы задаете в рубрике PascalАВС.NЕТ вопрос о том, можно ли в компиляторе с этого языка определить директивой условной компиляции Free Pascal? Удивительно, поскольку непонятно, для чего это надо. А Windows - это зачем? Компилятор требует .NET-среду - либо под Windows, либо в проекте Mono для Linux. Самому компилятору неинтересно, как именно предоставляется среда.

Остальное, может быть, в деталях Вам ответят те, кому эти вопросы ближе, чем мне.

Спасибо, У меня есть код, работающий на Free Pascal / Delphi. Я хочу адаптировать его для PascalABC. Соответственно - во время компиляции мне нужно знать с каким компилятором я работаю.

Нет, такой возможности нет

Так другие компиляторы и не подозревают о существовании PacalАВС.NЕТ. Так что единый код Вы все равно не сможете написать. И далее, что значит “адаптировать”? У Вас там конструкции, не работающие в PascalАВС.NЕТ ?

То есть ничего подобного нет ? http://docwiki.embarcadero.com/RADStudio/Rio/en/Conditional_compilation_(Delphi)

https://wiki.freepascal.org/Platform_defines

Да, типы и другая фишка.

Нет, конечно. Вы берете многоплатформенные проекты и почему-то удивляетесь, что их директив нет в проекте, рассчитанном на одну платформу? Могу Вас “обрадовать”: подобных директив я не встречал и в других .NET языках.

По крайней мере компилятору надо сообщить о самом себе - {$DEFINE PASCALABC}. Я не прав?

Кому сообщить, что именно и зачем? Если версию надо сообщить - то она лежит в PascalABCVersion - просто выводите. Зачем в коде программы PascalАВС.NЕТ сообщать, что он код PascalАВС.NЕТ ? Право же, Вы чего-то странного хотите.

Как ты пишешь код который должен работать на Free Pascal / Delphi / PascalABC ? Есть пример ? Допустим есть код на FPC / Delphi с типом UInt16, как ты его напишешь, чтобы он работал и на PascalABC?

uses System;

begin
  var a: UInt16 := 65000;
  Write(a);
end.

И не нужно “тыкать”. Мы с Вами на брудершафт не пили…

Да, это правильная идея. Но у нас этого нет. Точнее, мы начинали делать это: в PABCSystem.pas есть

{$define PascalABC}

Но она распространяется только на уровень одного модуля.

Попробуем сделать на глобальном уровне

Отлично. А такой тип есть в PascalABC? Где почитать ? Ну а вот это - function ZZX(n: UInt64; start: UInt64): Pointer; cdecl; external ‘libyyy’ name LIB_FNPFX + ‘ZZX’;

Хорошо.

Такой - это какой? Я же Вам написал рабочий код. Что касается Pointer - забудьте про них в NET-языках. Тут ссылочная объектная модель, они не нужны. Почитать про типы кратко можете в Справке. Расширено - в литературе на официальном сайте и в справке по Microsoft.NЕТ

Да, не пили. Извиняюсь.

Сообщение Admin: У нас на форуме принято общаться на Вы.

Надо сказать, что наша реализация {$define} полностью соответствует дельфийской. Там тоже определение распространяется на модуль, а не на всю программу. Вот пример из Delphi:

program Project4;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit3 in 'Unit3.pas';

var a: integer;

begin
   {$ifdef My}
   Write(1);
   {$endif}
   readln;
end.

А в Unit:

unit Unit3;

{$define My}

interface

implementation

end.

Так вот - программа не видит определение My из Unit.

То есть, обеспечивая совместимость, непонятно, как это сделать. В Delphi есть проекты, и в опциях проекта это можно указать. А без проекта - непонятно, как.

P.S. Кстати, в Delphi не определён символ Delphi

При наличии раздельной компиляции и с учетом того, что это директива (если верить Справке) предназначена для условной компиляции, с чего бы внешняя программа видела это определение? Другое дело, если говорить о том, чтобы сделать его глобальным. Но вот на самом деле, надо ли это настолько, чтобы заморачиваться? PascalАВС.NЕТ все дальше уходит от балласта, навязанного совместимостью с предшественниками.

5 сообщений перенесены в тему Болталка PascalABC.NET