Delphi的条件编译是否允许定义的符号包含值?

mag*_*nus 4 delphi macros preprocessor symbols

在Delphi中,您可以定义符号,就像在C/C++中一样.

德尔福:

{$DEFINE MY_SYMBOL}
Run Code Online (Sandbox Code Playgroud)

C/C++:

#define MY_SYMBOL
Run Code Online (Sandbox Code Playgroud)

这允许您通过{$IFDEF MY_SYMBOL}在Delphi或#ifdef MY_SYMBOLC/C++中使用来检查符号是否已定义.

这是一个布尔值 - 符号是在预处理期间定义的.但是,C/C++还允许您为预处理器符号赋值.例如:

#ifdef DEBUG
#define DB_HOST "127.0.0.1"
#else
#define DB_HOST "123.456.789.123"
#endif

Database *pDatabase = new Database(DB_HOST);
Run Code Online (Sandbox Code Playgroud)

是否可以在Delphi中为预处理器符号赋值,或者Delphi是否仅允许您确定是否已定义符号?

编辑:由于Delphi不支持预处理器中的符号,我假设它不支持预处理器.我在这个假设中是对的吗?

例如,在C中,您可以定义一个预处理器宏,在编译之前将其与适当的参数一起复制和粘贴.当您希望"内联函数"功能用于快速操作(例如,二进制逻辑,在整数值中测试,位移等)而没有堆栈帧的开销,参数传递等时,这非常有用.

#define OK_FLAG 0x00000001
#define OK(f) (f & OK_FLAG)

#define WEAK_XOR_CIPHER(v) (v ^ 0xff)
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 8

您可以简单地使用常量,并定义值:

const
{$IFDEF DEBUG}
  DB_Host = '127.0.0.1';
{$ELSE}
  DB_Host = '123.45.67.89';
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

你也可以反过来做(的东西测试没有被定义):

const
{$IFNDEF DEBUG}
  DB_Host = '123.45.67.89';
{$ELSE}
  DB_Host = '127.0.0.1';
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

这可确保DB_Host始终可用,并在不调试时具有适当的值.

最新版本的Delphi允许您测试常量的值.例如,系统单元已RTLVersion定义常量,您可以使用它测试值:

{$IF RTLVersion <= 26}
  // Less than XE5
{$ELSE}
  // XE5
{$IFEND}
Run Code Online (Sandbox Code Playgroud)

但是,Delphi不支持任何类型的宏.没有宏的典型解决方案是使用内联函数.例如,请参阅Windows单元的WinAPI RGB宏实现:

function RGB(r, g, b: Byte): COLORREF; inline;

function RGB(r, g, b: Byte): COLORREF;
begin
  Result := (r or (g shl 8) or (b shl 16));
end;
Run Code Online (Sandbox Code Playgroud)

  • FWIW,移动编译器可能派上用场的一件事:`{$ IF not declared(AnsiString)}`等. (2认同)