Extern...End Extern
Statement block to allow calling of functions compiled for specific languages or platforms.
Syntax
`
Extern { "C" | "C++" | "Windows" | "Windows-MS" | "rtlib" } [ Lib "libname" ]
declarative statements
End Extern
`
Description
`Extern` blocks provide default calling conventions for procedures and mandate a certain name decoration.
`Extern "C"` blocks provide a default `cdecl` calling convention to procedures, and also preserve the case of all names declared within them. The same effect can be achieved without the EXTERN block by using `cdecl` together with an `Alias` string containing the exact procedure name.
`Extern "C++"` blocks are exactly like `Extern "C"` blocks but they also mangle the names declared within them in a way compatible to that of g++-4.x.
`Extern "Windows"` blocks provide a default `stdcall` calling convention to procedures, preserve the case of all names declared within them, and on the Windows platform, append an `"@N"` suffix to procedure names, where `N` is the total size in bytes of any procedure parameters. Similar to the `Extern "C"` block, the same effect can be achieved by using `stdcall` and `Alias`.
`Extern "Windows-MS"` blocks are exactly like `Extern "Windows"` blocks but do not append the `"@N"` suffix to procedure names on Windows.
`Extern "rtlib"` blocks combine the name decoration of `Extern "c"` and the default calling convention of fbc. When used in a namespace, the symbol respects the scope of the namespace, however, the name decoration (name mangling) links the symbol to a regular C library. This behaviour may be desired when declaring procedures that exist in the fb run-time library; where calling convention is based on the target, but we would like to have the compile time name respect the namespace.
`Lib "libname"` can be used to specify a library which will be linked in as if `#Inclib "Libname"` or `-l libname` had been used. Additionally, all procedure declarations inside the Extern block will use the specified `Lib "libname"` as if it was specified as part of their declarations (but it can still be overridden with an explicit `Lib "libname"`).
Example
`
'' This procedure uses the default calling convention for the system, which is
'' STDCALL on Win32 and CDECL on Linux/DOS/*BSD, and is seen externally as
'' "MYTEST1@4" on Win32 and "MYTEST1" on Linux/DOS/*BSD (following FB's default
'' ALL-UPPER-CASE name mangling).
Sub MyTest1 ( ByVal i As Integer )
End Sub
Extern "C"
'' This procedure uses the CDECL convention and is seen externally
'' as "MyTest2".
Sub MyTest2 ( ByVal i As Integer )
End Sub
End Extern
Extern "C++"
'' This procedure uses the CDECL convention and its name is mangled
'' compatible to g++-4.x, specifically: "_Z7MyTest3i"
Sub MyTest3 ( ByVal i As Integer )
End Sub
End Extern
Extern "Windows"
'' This procedure uses the STDCALL convention and is seen externally
'' as "MyTest4@4" on Windows, and "MyTest4" on Linux, *BSD and DOS.
Sub MyTest4 ( ByVal i As Integer )
End Sub
End Extern
Extern "Windows-MS"
'' This procedure uses the STDCALL convention and is seen externally
'' as "MyTest5".
Sub MyTest5 ( ByVal i As Integer )
End Sub
End Extern
MyTest1( 0 )
MyTest2( 0 )
MyTest3( 0 )
MyTest4( 0 )
`
Dialect Differences

- `Extern` blocks are only available in the -lang fb dialect.

Differences from QB

- New to FreeBASIC

Platform Differences

- On Linux, *BSD and DOS platforms, `Extern "Windows"` blocks never append a `"@N"` suffix to procedure names, and thus are equal to `Extern "Windows-MS"`.

See also

- `cdecl`
- `stdcall`
- `Extern`