Условная компиляция и возможности языка Delphi
Вольный перевод поста Conditional Compilation with Featuresopen in new window.
Вы разрабатываете код который должен работать в разных версиях Delphi? Вы устали от написания примерно такого кода?
{$IF CompilerVersion >= 22}
class function Mapper<T1,T2>: IMapper<T1,T2>;
{$ENDIF}
1
2
3
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
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
2
3
4
5
6