Statement block to allow calling of functions compiled for specific languages or platforms.
Syntax
Extern { "C" | "C++" | "Windows" | "Windows-MS" } [ 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.
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
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