加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:21:01 所属栏目:大数据 来源:网络整理
导读:在Delphi中,您可以定义符号,就像在C/C++中一样. 德尔福: {$DEFINE MY_SYMBOL} C/C++: #define MY_SYMBOL 这允许您检查是否使用Delphi中的{$IFDEF MY_SYMBOL}或C/C++中的#ifdef MY_SYMBOL来定义符号. 这是一个布尔值 – 符号是在预处理期间定义的.但是,C/C+
在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是否仅允许您确定是否已定义符号?

编辑:由于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,b: Byte): COLORREF;
begin
  Result := (r or (g shl 8) or (b shl 16));
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读