gpt4 book ai didi

delphi - Delphi的条件编译允许定义的符号包含值吗?

转载 作者:行者123 更新时间:2023-12-03 15:22:08 26 4
gpt4 key购买 nike

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

德尔福:

{$DEFINE MY_SYMBOL}

C/C++:

#define MY_SYMBOL

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

这是一个 bool 值 - 符号是否在预处理期间定义。但是,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 只允许您确定符号是否已被定义?

编辑:由于 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 的最新版本允许您测试常量的值。例如,系统单元定义了常量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;

关于delphi - Delphi的条件编译允许定义的符号包含值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com