命令文ブロックで、特定の言語またはプラットホームを指定して、コンパイルできる機能を呼び出せるようにします。
構文:
Extern { "C" | "C++" | "Windows" | "Windows-MS" | "rtlib" } [ Lib "libname" ]
宣言の命令文
End Extern
記述:
Extern ブロックは、手続きに、デフォルト呼び出し規則を供給します。そして、特定の名前装飾を強制します。
Extern "C" ブロックは、手続きに、デフォルト
cdecl 呼び出し規則を提供します。また、手続きの中で宣言されたすべての名前の大文字と小文字の区別を保持します。
同じ効果は、EXTERN ブロックなしでも、
cdecl を、正確な手続き名を含む
alias 文字列と合せて使うことで、実現できます。
Extern "C++" ブロックは、ちょうど Extern "C" ブロックと似ています。しかし、手続きの中で g++-4.x に互換の方法で宣言された名前を、改ざんします。
Extern "Windows" ブロックは、手続きに、デフォルト
Stdcall 呼び出し規則を提供します。手続きの中で宣言されたすべての名前の大文字小文字を保持します。Windows プラットホームで、手続き名に、
"@N" 接尾語を追加します。ここで、
N は、すべての手続きパラメタの、バイトで表現される総サイズです。
Extern "C" ブロックと同様、同じ効果は、
stdcall と
alias を使って、実現できます。
Extern "Windows-MS" ブロックは、
Extern "Windows" ブロックに似ていますが、Windowsで
"@N" 接尾語を手続き名に追加しません。
Extern "rtlib" ブロックは、
Extern "c" の名前修飾と、fbc のデフォルトの呼び出し規約を、組み合わせます。
名前空間で使うと、シンボルは名前空間のスコープを尊重しますが、名前の装飾(名前修飾)は、シンボルを通常の C ライブラリにリンクします。
この動作は、fb ランタイム・ライブラリに存在する手続きを宣言するときに必要になる場合があります。
呼び出し規約は、ターゲットに基づいています。しかし、fb は、コンパイル時の名前は名前空間を尊重させたいと考えています。
Lib "libname" を、リンクするライブラリを指定するために、まるで
#inclib "libname" か
-l libname を使うように、使用できます。
さらに、
Extern ブロックの中のすべての手続きの宣言は、指定した
Lib "libname" を、まるでそれが手続きの宣言の一部として指定されているかのように、使います。(しかし、これは、
Lib "libname" を明示して、くつがえすことができます)
例:
'' この手続きは、システムのためのデフォルトの呼び出し規則を使います。
'' それは、Win32 の STDCALL と Linux/DOS/*BSDの CDECLです。
'' 外部的に、Win32 の "MYTEST1@4" と Linux/DOS/*BSD の "MYTEST1" とみなされます。
'' (続く FBのデフォルトの ALL-UPPER-CASE 名を台無しにします)
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 規則を使って、外部的に、
'' ウィンドウズの "MyTest4@4" 、およびLinux, *BSD and 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 )
方言差:
QBからの違い:
プラットホーム差:
-
Linux、*BSD、および DOS プラットホームでは、Extern "Windows" ブロックは、"@N" 接尾語を手続き名に追加しません。その結果、Extern "Windows-MS" と同じになります。
参照: