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

