{{fbdoc item="title" value="EXTERN...END EXTERN"}}---- Statement block to allow calling of functions compiled for specific languages or platforms. {{fbdoc item="syntax"}}## **Extern { """C""" | """C++""" | """Windows""" | """Windows-MS""" | """rtlib""" }** [ **[[KeyPgLib|Lib]]** "//libname//" ] //declarative statements// **End Extern** ## {{fbdoc item="desc"}} ##**Extern**## blocks provide default calling conventions for procedures and mandate a certain name decoration. ##**Extern """C"""**## blocks provide a default ##[[KeyPgCdecl|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 ##[[KeyPgCdecl|cdecl]]## together with an ##[[KeyPgAlias|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 ##[[KeyPgStdcall|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 ##[[KeyPgStdcall|stdcall]]## and ##[[KeyPgAlias|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. ##[[KeyPgLib|Lib]] "//libname//"## can be used to specify a library which will be linked in as if ##[[KeyPgInclib|#inclib "libname"]]## or ##[[CompilerOptl|-l libname]]## had been used. Additionally, all procedure declarations inside the **Extern** block will use the specified ##[[KeyPgLib|Lib]] "//libname//"## as if it was specified as part of their declarations (but it can still be overridden with an explicit ##[[KeyPgLib|Lib]] "//libname//"##). {{fbdoc item="ex"}} {{fbdoc item="filename" value="examples/manual/module/extern-block.bas"}}%%(freebasic) '' 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 ) %% {{fbdoc item="lang"}} - ##**Extern**## blocks are only available in the //[[CompilerOptlang|-lang fb]]// dialect. {{fbdoc item="diff"}} - New to ""FreeBASIC"" {{fbdoc item="target"}} - 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"**##. {{fbdoc item="see"}} - ##[[KeyPgCdecl|Cdecl]]## - ##[[KeyPgStdcall|Stdcall]]## - ##[[KeyPgExtern|Extern]]## {{fbdoc item="back" value="CatPgModularizing|Modularizing"}}