在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;