Блок операторов, разрешающий вызов функций, скомпилированных для конкретных
языков или платформ.
Синтаксис
Extern { "C" | "C++" | "Windows" | "Windows-MS" } [ Lib "libname" ]
declarative statements
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"
, но не добавляют суффикс
"@N" для имен процедур на Windows.
Lib "libname" может использоваться
для указания библиотеки, которая будет связана, как если бы использовалось
#Inclib "Libname"
или
-l libname . Кроме того, все
описания процедур внутри блока
Extern будут использовать указанный
Lib "libname"
как будто это было указано в качестве части их заявлений (но это может быть
отменено с явным
Lib "libname").
Пример
'' Эта процедура использует соглашение о вызовах для
системы, которая является по умолчанию
'' STDCALL на Win32 и CDECL на Linux/DOS/*BSD, и
внешне воспринимается как
'' "MYTEST1@4" на Win32 и "MYTEST1" на Linux/DOS/*BSD (по
умолчанию в FB
'' все имена в верхнем регистре).
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" на Windows, и "MyTest4" на Linux, *BSD и DOS.
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 )
Различия диалектов
- Extern блоки доступны только в диалекте -lang fb.
Отличия от QB
Различия платформ
- На Linux, *BSD и DOS платформах, Extern "Windows" блоки
никогда не добавляют суффикс "@N" к именам
процедур, и таким образом, равны Extern "Windows-MS".
См. также