语句块允许调用为特定语言或平台编译的函数。
语法
Extern { "C" | "C++" | "Windows" | "Windows-MS" } [ Lib "libname " ]
declarative statements
End Extern
说明
Extern块为过程提供默认调用约定,并要求某个名称装饰。
Extern "C"块为过程提供了默认的
cdecl调用约定,并且还保留了在其中声明的所有名称的大小写。如果没有EXTERN块,则可以使用
cdecl与包含确切的过程名称的
Alias字符串相同的效果。
Extern "C++"块完全像
Extern "C"块,但它们也以与
g++-4.x 兼容的方式在其中声明的名称进行翻转。
Extern "Windows"块为过程提供了一个默认
stdcall调用约定,保留在其中声明的所有名称的情况,并且在Windows平台上,将
"@N "后缀追加到过程名称,其中
N 是总大小任何程序参数的字节。与
Extern "C"块类似,使用
stdcall和
Alias可以实现相同的效果。
Extern "Windows-MS"块完全像
Extern "Windows"块,但在Windows上不附加
"@N "后缀到过程名称。
Lib "libname "可以用于指定将被链接的库,就好像
#Inclib "Libname"或
-l libname已被使用。另外,
外部块内的所有过程声明都将使用指定的
Lib "libname ",就像它们被声明的一部分一样(但是仍然可以用显式
Lib "libname "覆盖)。
例子
''该过程使用系统的默认调用约定,即
''在Win32上的STDCALL和Linux / DOS / * BSD上的CDECL,并在外部看到
'' "MYTEST1@4" on Win32 and "MYTEST1" on Linux/DOS/*BSD (following FB'的默认值
''ALL-UPPER-CASE名称改编)。
Sub MyTest1 ( ByVal i As Integer )
End Sub
Extern "C"
''此过程使用CDECL约定,并在外部看到
''作为“MyTest2”。
Sub MyTest2 ( ByVal i As Integer )
End Sub
End Extern
Extern "C++"
''此过程使用CDECL约定,其名称被破坏
''兼容g ++ - 4.x,具体来说:“_Z7MyTest3i”
Sub MyTest3 ( ByVal i As Integer )
End Sub
End Extern
Extern "视窗"
''此过程使用STDCALL约定,并在外部看到
''在Windows上为“MyTest4 @ 4”,Linux上为“MyTest4”,* BSD和DOS。
Sub MyTest4 ( ByVal i As Integer )
End Sub
End Extern
Extern "Windows-MS"
''此过程使用STDCALL约定,并在外部看到
''作为“MyTest5”。
Sub MyTest5 ( ByVal i As Integer )
End Sub
End Extern
MyTest1( 0 )
MyTest2( 0 )
MyTest3( 0 )
MyTest4( 0 )
方言差异
与QB差别
平台差异
- 在Linux,* BSD和DOS平台上,外部的“Windows”块从不在过程名称上附加@ N “后缀,因此等于外部的 “Windows MS”.
参考