下一个申请
program Project1;
{$IFDEF FPC}
{$mode delphi}
{$ENDIF}
begin
{$IFDEF CPU386}
Writeln('CPU386');
{$ENDIF}
Readln;
end.
在我的系统(Win7 64位,CPU intel core i3)上使用Delphi(XE)和FPC(2.6.2)生成不同的输出。 Delphi输出CPU386
字符串,FPC不输出。
好像FPC没有为我的CPU定义CPU386
符号(参见the list of FPC defines);它改为定义CPUX86_64
符号。
到目前为止,我正在使用下一个解决方法:
{$IFDEF FPC}
{$IFNDEF CPU386}
{$IFDEF CPUX86_64}
{$DEFINE CPU386}
{$ENDIF}
{$ENDIF}
{$ENDIF}
答案 0 :(得分:2)
这是预期的。 CPU386
条件适用于32位Intel x86目标。 CPUX86_64
条件适用于64位Intel x64目标。
使用64位Delphi编译器编译程序时,它也不会产生任何输出。因为没有为64位Delphi编译器定义CPU386
条件。
执行此操作不正确:
{$IFDEF CPUX86_64}
{$DEFINE CPU386}
{$ENDIF}
CPU386
表示目标架构是32位Intel x86。并且64位Intel x64不是。
预定义条件的Delphi文档位于:http://docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi)#Predefined_Conditionals
它列出了CPU标题下的以下内容:
对于32位x86目标,Delphi和FPC都定义CPU386
。对于64位x64目标,Delphi定义CPUX64
,FPC定义CPUX86_64
。
如果您需要在共享源代码中使用常见条件,那么您可能需要做一些额外的工作。假设你选择CPUX86
和CPUX64
。然后你会包括这个:
{$IFDEF FPC}
{$IFNDEF CPU386}
{$DEFINE CPUX86}
{$ENDIF}
{$IFNDEF CPUX86_64}
{$DEFINE CPUX64}
{$ENDIF}
{$ENDIF}
答案 1 :(得分:1)
最简单的方法是查看FPC的“fpc -va输出,看看(32位)FPC在i386上定义的内容:(2.6.0)
[0.002] Macro defined: CPU86
[0.002] Macro defined: CPU87
[0.002] Macro defined: CPU386
[0.002] Macro defined: CPUI386
[0.002] Macro defined: CPU32
64位编译器定义:(2.7.1,手头没有发布版本)
[0.004] Macro defined: CPUX86_64
[0.004] Macro defined: CPUAMD64
[0.004] Macro defined: CPU64
[0.004] Macro defined: CPUX64
很可惜Delphi没有选择兼容的定义。由于x86_64架构已经多次重命名,因此FPC定义了几个。
注意btw CPU32和CPU64用于一般32/64位切换。将此用于仅影响指针大小但不特定于x86的任何内容。虽然最初主要是为了在英特尔和PowerPC之间进行抽象,但 64位ARM 将会再次出现这个问题。
cpui386和cpux86_64用于真正针对特定处理器的更改。
这些定义的手册是here