Условная компиляция и возможности языка Delphi

Вольный перевод поста Conditional Compilation with Featuresopen in new window.

Вы разрабатываете код который должен работать в разных версиях Delphi? Вы устали от написания примерно такого кода?

{$IF CompilerVersion >= 22}
class function Mapper<T1,T2>: IMapper<T1,T2>;
{$ENDIF}
1
2
3

При этом вы

  • никогда не знаете точно когда определённая возможность была введена в Delphi
  • всегда сомневаетесь в том какая версия Delphi имеет версию компилятора (CompilerVersion) равную 22

Вместо написания условий по версии компилятора, вы можете думать в терминах возможностей языка. Код выше требует версию Delphi которая поддерживает обобщённое программирования и содержит реализацию TArray<T>. Так что можно переписать код примерно так

{$IFDEF F_Generics}{$IFDEF F_TArrayOfT}
class function Mapper<T1,T2>: IMapper<T1,T2>;
{$ENDIF}{$ENDIF}
1
2
3

Это проще для написания (так как не нужно помнить что в какой версии добавлено) и проще для понимания.

Директивы для таких проверок можно подключить из файла jedi.incopen in new window. В этом файле содержатся директивы вида HAS_XXXXX и SUPPORTS_XXXXX, например, такие как

  SUPPORTS_LOCAL                 Compiler supports the local directive (D6+/BCB6+)
  SUPPORTS_SETPEFLAGS            Compiler supports the SetPEFlags directive (D6+/BCB6+)
  SUPPORTS_EXPERIMENTAL_WARNINGS Compiler supports the WARN SYMBOL_EXPERIMENTAL and WARN UNIT_EXPERIMENTAL directives (D6+/BCB6+)
  SUPPORTS_INLINE                Compiler supports the inline directive (D9+/FPC)
  SUPPORTS_FOR_IN                Compiler supports for in loops (D9+)
  SUPPORTS_NESTED_CONSTANTS      Compiler supports nested constants (D9+)
1
2
3
4
5
6
Последниее изменение: 24.08.2023, 06:42:55