Extern...End Extern
 
语句块允许调用为特定语言或平台编译的函数。

语法

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"块类似,使用stdcallAlias可以实现相同的效果。

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 )


方言差异

  • 外部块仅在-lang fb 方言中可用。

与QB差别

  • 新的FreeBASIC

平台差异

  • 在Linux,* BSD和DOS平台上,外部的“Windows”块从不在过程名称上附加@ N 后缀,因此等于外部的 “Windows MS”.

参考