Как насчёт того чтоб сделать несколько идентификаторов по умолчанию для {$ifdef}
и {$ifndef}
?
(ну и у меня ещё not и and используются в {$ifdef }, в последнем примере, которые сложно адекватно заменить)
Например:
{$ifndef EnvironmentLaunched}
System.Console.Clear;
{$endif}
чтоб в exe файл записывало эту строчку если программа не была запущена через простое F9.
Возьмём пример из CRT:
function RedirectIOUnitUsed: boolean;
var
t: &Type;
begin
t := System.Reflection.Assembly.GetExecutingAssembly.GetType('__RedirectIOMode.__RedirectIOMode');
Result := t <> nil;
end;
и далее
if (not RedirectIOUnitUsed) {and IsConsoleApplication} then
//здесь ошибка, IsConsoleApplication у нас никогда не инициализируется
//это комментарий из самого CRT, ещё 1 причина добавлять идентификаторы, IsConsoleApplication
//может меняться с помощью {$apptype }, а на сколько я понимаю директивы компилятору так устроены
//что переменной передать значение заданное директивой очень неудобно
Это if
становится частью готовой программы и проверяет при запуске каждый раз, можно сказать что это не значительно, но я отвечу что это просто не красиво…
Так было бы на много лучше:
procedure __InitModule;
begin
//можно тут и из C++ взять его ! и &&, тогда можно без пробелов написать, а новички всё равно директивы компилятору не будут использовать
{$ifdef not EnvironmentLaunched and IsConsoleApplication}
Console.CursorSize := 15;
BlankString := ' '*(Console.BufferWidth - 1);
{$else}
Console.WriteLine('Программу с подключенным модулем CRT нельзя запускать по F9.');
Console.WriteLine('Запустите программу, используя Shift-F9');
Halt;
{$endif}
end;
Ну и разумеется спектр применения большой, не только делать код более красивым
P.S.
Как недавно было сказано в теме “Помощь новичкам” использовать отладку с CRT нельзя как раз из за этого Halt в инициализации.
Возможно стоит заменить на такое:
Console.WriteLine('Программу с подключенным модулем CRT нежелательно запускать по F9,');
Console.WriteLine('такие процедуры как clrscr будут вызывать исключение(ошибку времени выполнения).');
Console.WriteLine('Нажмите Enter чтобы продолжить или завершите программу и запустите с Shift+F9');
Readln;
P.P.S.
Не нашёл замены #pragma
из C#, а ведь довольно полезная директива