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



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

德尔福

:

{$DEFINE MY_SYMBOL}

C/c++:

#define MY_SYMBOL

这允许您检查符号是否在Delphi中使用{$IFDEF MY_SYMBOL}定义,或在C/c++中使用#ifdef MY_SYMBOL定义。

这是一个布尔值——符号要么在预处理期间定义,要么不定义。然而,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);

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

EDIT:由于Delphi在预处理器中不支持符号,我假设它不支持预处理器。我的假设对吗?

例如,在C中,您可以定义一个预处理器宏,在编译之前将其复制并粘贴为适当的参数。当你想要快速操作的"内联函数"功能(例如,二进制逻辑,测试整数值,位移位等)时,这是有用的,而不需要堆栈帧的开销,参数传递等。

#define OK_FLAG 0x00000001
#define OK(f) (f & OK_FLAG)
#define WEAK_XOR_CIPHER(v) (v ^ 0xff)

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

const
{$IFDEF DEBUG}
  DB_Host = '127.0.0.1';
{$ELSE}
  DB_Host = '123.45.67.89';
{$ENDIF}

你也可以做相反的(测试不是被定义的东西):

const
{$IFNDEF DEBUG}
  DB_Host = '123.45.67.89';
{$ELSE}
  DB_Host = '127.0.0.1';
{$ENDIF}

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

Delphi的最新版本允许您测试常量的值。例如,System单元定义了常量RTLVersion,您可以使用它来测试一个值:

{$IF RTLVersion <= 26}
  // Less than XE5
{$ELSE}
  // XE5
{$IFEND}
但是,

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;

最新更新