Extern...End Extern
 
Блок операторов, разрешающий вызов функций, скомпилированных для конкретных языков или платформ.

Синтаксис

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

  • Новое в FreeBASIC

Различия платформ

  • На Linux, *BSD и DOS платформах, Extern "Windows" блоки никогда не добавляют суффикс "@N" к именам процедур, и таким образом, равны Extern "Windows-MS".

См. также