声明双重接口的方法必须使用safecall;保留pascal调用是为了向后兼容性。要了解更多的调用约定的信息,请参考Program control。
指示字near、far和export用在16位Windows编程中,它们对32位程序没有影响,保留它们是为了向后兼容性。
Forward and intece declarations(Forward声明和接口部分的声明)
在声明过程或函数时,用forward指示字取代例程块(包括局部变量声明和语句),比如,
function Calculate(X, Y: Integer): Real; forward;
这就声明了一个叫做Calculate的函数,在forward声明后的某个地方,例程必须进行定义声明,包括例程块。Calculate的定义声明看起来这样:
function Calculate;
... { declarations }
begin
... { statement block }
end;
- 82 -
Procedures and functions
通常,定义声明不必重新列出例程使用的参数或者返回值类型,但如果这样做的话,它必须和forward声明完全一致(除了默认参数能被忽略)。若forward声明是一个重载的过程或函数,则必须在定义声明中重新列出它的参数。
在forward声明和它的定义声明之间,除了声明外不能有其它内容。定义声明可以是external或assembler,但不能是另外的forward声明。
forward声明的目的是把过程或函数标志符的作用域提前,这允许在它被实际定义之前,其它过程和函数可以进行调用。除了能使你更灵活地组织代码外,forward声明对相互递归调用(mutual recursion)有时是必须的。
在单元的接口(intece)部分,forward指示字是不允许的,但是,接口部分的过程头或函数头,它们的行为就像forward声明,它们的定义声明必须出现在实现(implementation)部分。在单元的接口部分声明的例程,在本单元的其它任何位置都可以访问;对于使用本单元的其它单元或程序,这些例程也是可以访问的。
External declarations(External声明)
在声明过程或函数时,用external指示字取代例程块,能允许你调用和程序分开编译的例程。外部例程可以来自目标文件或动态调入库(dynamically loadable library)。
当导入一个带有可变数目参数的C++函数时,要使用varargs指示字。比如,
function printf(Format: PChar): Integer; cdecl; varargs;
varargs指示字只能用于外部例程,并且只能使用cdecl调用约定。
链接目标文件
要调用目标文件中的例程,首先要使用$L(或$LINK)编译器指示字把目标文件链接到你的程序中。比如,
在Windows下: {$L BLOCK.O}
在Linux下: {$L block.o}
把BLOCK.O(Windows)或block.o (Linux)链接到程序或它所在的单元。然后,声明你想调用的函数和过程:
procedure MoveWord(var Source, Dest; Count: Integer); external;
procedure FillWord(var Dest; Data: Integer; Count: Integer); external;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-58.html
没真正打过不知道自己有多少毛病