对包含汇编代码的跨平台代码使用Delphi预定义的条件符号

对包含汇编代码的跨平台代码使用Delphi预定义的条件符号,delphi,Delphi,这是我第一次使用Delphi编写跨平台程序 我已经阅读了Delphi XE8文档中的以下主题: ` 这两篇文章都建议在跨平台代码中使用预定义的条件符号时使用以下构造: function TheFunc(x: Integer): Integer; {$IFDEF PUREPASCAL} begin // Pascal implementation here... end; {$ELSE !PUREPASCAL} {$IFDEF CPUX86} asm // ASM imple

这是我第一次使用Delphi编写跨平台程序

我已经阅读了Delphi XE8文档中的以下主题:

  • `
这两篇文章都建议在跨平台代码中使用预定义的条件符号时使用以下构造:

function TheFunc(x: Integer): Integer;
{$IFDEF PUREPASCAL}
begin
  // Pascal implementation here...
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
  asm
    // ASM implementation here...
  end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}
通过谷歌搜索,我没有在网站上找到预定义符号
PUREPASCAL
的定义或描述。我现在的理解是,
{$IFDEF purpascal}
意味着如果目标平台不支持汇编程序,则将编译该上下文中的代码。请确认。。。我理解正确吗

所以我的实际问题是。。。为什么文档提供的示例建议将
{$IFDEF purpascal}
优先于
{$IFDEF CPUX86}
?在x64模式下编译上述函数应失败

为什么不这样呢

function TheFunc(x: Integer): Integer;
{$IFDEF CPUX86}
  asm
    // ASM implementation here...
  end;
{$ELSE}
begin
  // Pascal implementation here...
end;
{$ENDIF}

这样,在目标平台不支持汇编程序的情况下,可以保证编译Pascal(非汇编)代码。

PUREPASCAL
不是由编译器定义的。一些库使用它来允许开发人员覆盖默认设置并强制使用Pascal。但是您通常会通过
PUREPASCAL
启用Pascal代码,或者目标平台没有实现asm版本


如果您愿意,您可以使用这种方法,但是对于常规开发来说,没有什么可说的。你的方法很好。继续吧

PUREPASCAL不是由编译器定义的。你为什么要写asm呢?我写asm只是为了解决一个非常简单的问题,比如计算base-2 log。使用asm解决此类问题很容易,即对于32位代码使用
BSR EAX,EAX
,对于64位代码使用
BSR RAX,RCX
。我明白了。非常感谢。
PUREPASCAL
也被Embarcadero的RTL本身使用。例如,下面是XE5的
SysUtils
单元的一个片段:
{$IFDEF CPUX86}{$DEFINE X86ASM}{$ELSE!CPUX86}{$DEFINE PUREPASCAL}{$DEFINE PUREPASCAL_X64ONLY}{$ENDIF!CPUX86}