Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - EXTERN ... END EXTERN

Referenz-Navigation

 

Syntax:

EXTERN { "C" | "C++" | "Windows" | "Windows-MS" } [ LIB "LibName" ]
   ' Deklarationen
END EXTERN

Typ: Anweisung
Kategorie: Bibliotheken

'EXTERN "Schema"' startet einen Block dessen Deklarationen eine dem angegebenen Schema entsprechende Aufruf- und Namens-Konvention befolgen. Dies wird insbesondere dazu eingesetzt um eine Schnittstelle zu in anderen Programmiersprachen geschriebenen Bibliotheken zu definieren. Auch bei der Rückgabe von Fehlermeldungen oder beim Debuggen mittels externer Programme kann die neue Namensgebung von Vorteil sein. Für den Programmfluss hat der Block keine direkten Auswirkungen.

EXTERN wirkt sich wie folgt auf Deklarationen innerhalb des Blocks aus:

Folgende Schema sind verfügbar:

BefehlsreferenzeintragLIB "LibName" kann verwendet werden, um eine Lib einzubinden. Zusätzlich werden alle Prozedurdeklarationen innerhalb des Blocks so behandelt, als wäre bei der Deklaration ein 'LIB "LibName"' angegeben worden. Das kann aber durch explizite Angabe von LIB bei der Deklaration überschrieben werden.

Im EXTERN...END EXTERN-Block sind nur Deklarationen zulässig, sogenannte "ausführbare Anweisungen" dürfen innerhalb eines Blocks nicht auftreten. Im Detail sind die erlaubten Anweisungen:

Ein Vorteil einer solchen Behandlung ist auch, dass der Linker einen leichter lesbaren Namen zurückgibt, wenn eine Referenz nicht gefunden werden konnte.

Als Block-Anweisung erstellt EXTERN einen eigenen BefehlsreferenzeintragSCOPE-Block.

Beispiel:

EXTERN "C++"
  ' Auch innerhalb des Namespace gilt die C++-Behandlung
  NAMESPACE Ns1
    DECLARE FUNCTION theFunction( BYVAL AS INTEGER ) AS UINTEGER
  END NAMESPACE
END EXTERN

' Innerhalb dieses Namespace gilt die FreeBASIC-Behandlung
NAMESPACE Ns2
  DECLARE FUNCTION theFunction( BYVAL AS INTEGER ) AS UINTEGER
END NAMESPACE

' Beide Funktionen existieren nicht; für beide wird also
' eine Fehlermeldung ausgegeben.
' Hier wird allerdings demonstriert, wie GNU C++ und
' FreeBASIC die Bezeichner intern handhaben; die
' Fehlermeldung EXTERN C++-Funktion ist wesentlich
' einfacher zu lesen:

Print Ns1.theFunction( 1 )
Print Ns2.theFunction( 1 )

Ausgabe:
Unter Windows erhält man in etwa folgende Fehlermeldung:

test.o:fake:(.text+0x54): undefined reference to `Ns1::theFunction(int)'
test.o:fake:(.text+0x68): undefined reference to `_ZN3NS211THEFUNCTIONEi@4

Dagegen sieht die Fehlermeldung unter Linux im zweiten Fall freundlicher aus:

test.o: In function `main':
(.text+0x23): undefined reference to `Ns1::theFunction(int)'
test.o: In function `main':
(.text+0x3a): undefined reference to `NS2::THEFUNCTION(int)'

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unter Linux hängt EXTERN "Windows" nie das Suffix "@N" an

Unterschiede zu früheren Versionen von FreeBASIC:

Unterschiede unter den FB-Dialektformen: nur zulässig in der Dialektform Befehlsreferenzeintrag-lang fb

Siehe auch:
BefehlsreferenzeintragEXTERN (Module), BefehlsreferenzeintragNAMESPACE, BefehlsreferenzeintragDECLARE, BefehlsreferenzeintragCDECL, BefehlsreferenzeintragSTDCALL, BefehlsreferenzeintragModule (Library / DLL)


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 24.07.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 08.10.2015 von RedakteurSt_W gespeichert.
  Versionen Versionen