Я работал над тем, чтобы Log4D работал в Delphi XE4 и получал некоторые ошибки компиляции, потому что он не мог найти Contnrs в предложении uses, если только я не переместил его за пределы ifdef, в котором он был определен.
{$IFDEF DELPHI5_UP}
Contnrs,
{$ENDIF}
Немного разобравшись, выяснилось, что ifdef определен во включенном файле Defines.inc, который имеет блок для каждой поддерживаемой версии delphi, которая останавливает несколько версий:
например:
{$IFDEF VER170} { Delphi 2005 }
{$DEFINE DELPHI9}
{$DEFINE DELPHI4_UP}
{$DEFINE DELPHI5_UP}
{$DEFINE DELPHI6_UP}
{$DEFINE DELPHI7_UP}
{$ENDIF}
{$IFDEF VER180} { Delphi 2006 }
{$DEFINE DELPHI10}
{$DEFINE DELPHI4_UP}
{$DEFINE DELPHI5_UP}
{$DEFINE DELPHI6_UP}
{$DEFINE DELPHI7_UP}
Итак, хотя было бы довольно легко пойти и скопировать и вставить ifdef для Delphi 2006 и создать блок Delphi XE4... это похоже на неэлегантное решение. Это определенно не будущее доказательство... каждая новая версия вам нужно обновить этот файл сейчас, поэтому некоторый код, отсутствующий в Delphi 4, не заставит кого-то еще 15 летнего старого кода взорваться.
Итак, мне было интересно, есть ли лучший способ сделать условную компиляцию, чтобы она действительно проверяла, есть ли у вас "Delphi 5 или выше" при компиляции этой строки, а не в этом формате, который требует обновления каждой новой версии delphi это выходит.