Bindung

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Deklarationen - Index

Ein ausführbares Programm entsteht normalerweise durch die Compilierung von verschiedenen, voneinander unabhängigen Übersetzungseinheiten und anschließendem Linken der resultierenden Objektdateien mit bereits vorhandenen Bibliotheken. Probleme können entstehen, wenn derselbe Bezeichner in verschiedenen Gültigkeitsbereichen (etwa in unterschiedlichen Dateien) oder mehr als einmal im gleichen Gültigkeitsbereich deklariert ist. Linken ist der Vorgang, der die korrekte Verknüpfung zwischen jedem Auftreten eines Bezeichners und einem Objekt oder einer bestimmten Funktion herstellt. Alle Bezeichner haben eines der drei Bindungsattribute, das eng an ihren Gültigkeitsbereich angelehnt ist: externe Bindung, interne Bindung oder keine Bindung. Diese Attribute werden von der Position und dem Format Ihrer Deklarationen, sowie dem expliziten (oder durch Voreinstellung impliziten) Einsatz der Speicherklassen-Bezeichner static oder extern bestimmt.

Jedes Auftreten eines bestimmten Bezeichners mit externer Bindung repräsentiert in allen Dateien und Bibliotheken eines Programms dasselbe Objekt oder dieselbe Funktion. Jedes Auftreten eines Bezeichners mit interner Bindung repräsentiert dasselbe Objekt oder dieselbe Funktion nur in einer Datei. Bezeichner ohne Bindung repräsentieren eindeutige Einheiten.

Regeln für das externe und interne Binden

Alle Objekt- und Dateibezeichner, die den Gültigkeitsbereich Datei besitzen, verfügen über interne Bindung, wenn ihre Deklaration den Speicherklassen-Bezeichner static enthält.

Kommt derselbe Bezeichner innerhalb derselben Datei mit interner und externer Bindung vor, so erhält er in C++ eine externe Bindung. In C hingegen erhält er eine interne Bindung.

Enthält die Deklaration eines Objekt- oder Funktionsbezeichners den Speicherklassen-Bezeichner extern, hat der Bezeichner dieselbe Bindung wie jede sichtbare Deklaration des Bezeichners mit dem Gültigkeitsbereich Datei. Ist keine derartige Deklaration vorhanden, hat der Bezeichner externe Bindung.

Wird eine Funktion ohne Speicherklassen-Bezeichner deklariert, wird ihre Bindung so festgelegt, als ob der Bezeichner extern verwendet worden wäre.

Wenn ein Objektbezeichner mit dem Gültigkeitsbereich Datei ohne einen Speicherklassen-Bezeichner deklariert wird, hat er externe Bindung.

Folgende Bezeichner haben das Attribut Keine Bindung:

  • Jeder Bezeichner, der nicht als Objekt- oder Funktionsbezeichner deklariert wird (zum Beispiel ein typedef-Bezeichner)
  • Funktionsparameter
  • Bezeichner mit dem Gültigkeitsbereich Block für Objekte, die nicht zu der Speicherklasse extern gehören

Ergänzen von Namen

Wenn ein C++ Modul compiliert wird, erzeugt der Compiler Funktionsnamen, die die Typen der Funktionsargumente in verschlüsselter Form enthalten. Dieser Vorgang wird als Namensergänzung (im Englischen "name mangling") bezeichnet. Dadurch wird die Verwendung überladener Funktionen möglich. Außerdem ist der Linker besser in der Lage, Fehler in Aufrufen von Funktionen in anderen Modulen herauszufinden. Es gibt jedoch Situationen, in denen die Namensergänzung nicht wünschenswert ist. Wenn ein C++ Modul mit einem Modul gelinkt werden soll, das keine ergänzten Namen enthält, muss dem C++ Compiler mitgeteilt werden, dass er die Funktionsnamen aus den anderen Modulen nicht ergänzen soll. Eine derartige Situation ist dann gegeben, wenn Bibliotheken oder OBJ-Dateien gelinkt werden, die mit einem C-Compiler kompiliert wurden.

Wenn der C++ Compiler den Namen einer Funktion nicht ergänzen soll, deklarieren Sie die Funktion als extern "C" wie in folgendem Beispiel:



 extern "C" void Cfunc( int );



Diese Deklaration teilt dem Compiler mit, die Referenzen auf die Funktion Cfunc nicht zu ergänzen.

Sie können die Deklaration extern "C" auch auf einen Namensblock anwenden:



 extern "C" {
    void Cfunc1( int );
    void Cfunc2( int );
    void Cfunc3( int );
 };



Genau wie bei der Deklaration für eine einzelne Funktion wird auch hier dem Compiler mitgeteilt, dass Referenzen auf die Funktionen Cfunc1, Cfunc2 und Cfunc3 nicht ergänzt werden sollen. Diese Art der Blockdeklaration können Sie auch dann verwenden, wenn der Funktionsnamen-Block in einer Header-Datei steht:



 extern "C" {
    #include "locallib.h"
 };



Anmerkung:  extern "C" darf nicht zusammen mit Klassenbezeichner verwendet werden.

Siehe auch