Skip to content

EXTERN...END EXTERN


语句块,用于调用针对特定语言或平台编译的函数。

语法

vb
Extern { "C" | "C++" | "Windows" | "Windows-MS" | "rtlib" } [ 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" 后缀。

Extern "rtlib" 块结合了 Extern "c" 的名称修饰与 fbc 的默认调用约定。在命名空间中使用时,符号遵从命名空间的作用域,但名称修饰(名称改编)会将符号链接到普通 C 库。在声明 fb 运行时库中存在的过程时,此行为可能是所需要的——调用约定基于目标平台,但我们希望编译时名称遵从命名空间。

Lib "libname" 可用于指定一个库,该库将被链接进来,效果如同使用了 #inclib "libname"-l libname。此外,Extern 块内的所有过程声明将使用指定的 Lib "libname",如同它是声明的一部分(但仍可通过显式 Lib "libname" 覆盖)。

示例

start GeSHi

vb
'' 此过程使用系统的默认调用约定——在 Win32 上为 STDCALL,在 Linux/DOS/*BSD 上为 CDECL,
'' 在 Win32 上对外可见名为 "MYTEST1@4",在 Linux/DOS/*BSD 上为 "MYTEST1"
'' (遵循 FB 默认的全大写名称修饰)。
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 "Windows"
    '' 此过程使用 STDCALL 约定,在 Windows 上对外可见名为 "MyTest4@4",
    '' 在 Linux、*BSD 和 DOS 上为 "MyTest4"。
    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 )

end GeSHi

方言差异

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

与 QB 的区别

  • FreeBASIC 新增

平台差异

  • 在 Linux、*BSD 和 DOS 平台上,Extern "Windows" 块不会在过程名后追加 "@N" 后缀,因此等同于 Extern "Windows-MS"

另请参阅

  • Cdecl
  • Stdcall
  • Extern

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系