2016-06-21 10 views
0

In Lischner's C++ in a Nutshell 2002Gehört die Sprachverknüpfung nur zu einer Funktion?

jede Funktion, Funktionstyp und Objekt verfügt über eine Sprach Verknüpfung,, die als einfache Zeichenfolge angegeben wird. Standardmäßig ist die Verknüpfung "C++". Die einzige andere Standardsprachverknüpfung ist "C". Alle andere Sprachverknüpfungen und die Eigenschaften, die mit verschiedenen Sprachverknüpfungen verknüpft sind, sind implementierungsdefiniert.

Gehört die Sprachverknüpfung nur zu einer Funktion, nicht zu einem Nichtfunktionsobjekt? Die Beispiele, die ich gesehen habe, scheinen ja zu sagen. Aber ich denke, ich vermisse etwas.

Was bedeutet das Zitat für jeden 'Funktionstyp' und 'Objekt' mit einer Sprachverknüpfung?

Danke.

+0

Sind Sie fragen, wenn das Zitat aus dem Buch falsch? – davmac

+2

ich bin zu faul standard Tauchen zu gehen, um die richtige Antwort zu produzieren, aber das Buchs der Annahme korrekt ist, und kann von dem Standard unterstützt, ich bin mir ziemlich sicher, dass der Grund, warum Sie Beispiele für Sprach Verknüpfung nicht für Objekte sehen, ist, dass Implementierungen nicht tatsächlich unterschiedliche Namen-Mangling oder andere Linker-Details für C- und C++ - Verknüpfungen verwenden müssen, sodass in der Praxis die Sprachverknüpfung für Objekte keinen Unterschied macht. –

Antwort

0

Nein, Variablen können auch eine Sprachverknüpfung haben.

Zunächst einmal Ihr Buch umschreibt Standard:

Alle Funktionstypen, Funktionsnamen mit externer Bindung, und Variablennamen mit externer Bindung Sprache Bindung hat.

Dies allein deutet darauf hin, dass Sie Verbindungsspezifikationen auf Variablen anwenden können.

Weiter unten gibt es dieses Beispiel:

extern "C" int i; // declaration 
extern "C" { 
    int i; // definition 
} 

, die zeigt, wie Sie Verknüpfung Spezifizierer auf nicht-Funktion anwenden können. Zusätzlich gibt es mehrere Erwähnungen von Funktionen und Variablen durch ganze [dcl.link] Kapitel des Standards.

0

Die Spezifikationen für Sprachverknüpfungen sollen das Verknüpfen derselben Programmobjektdateien aus verschiedenen Quellsprachen ermöglichen.

Das Problem besteht darin, dass Namen von Entitäten (Funktionen, Variablen usw.) in Objektdateien im Allgemeinen nicht exakt mit den Namen der entsprechenden Entitäten im Quellcode übereinstimmen.

C, eine alte und "einfache" Sprache, kümmerte sich nicht um solche Überlegungen und verwendete Quellennamen in den Objektdateien so wie sie sind.

In C++, das auf C aufbaut, wurde das Überladen von Funktionen eingeführt, damit verschiedene Funktionen denselben Namen haben. Daher musste die Signatur von C++ - Funktionen im Symbolnamen kodiert werden, der diese Funktion in einer Objektdatei darstellt.

Außerdem Namen von C++ Einheiten können die folgenden Zeichen enthalten (die nicht in C Identifikatoren erscheinen könnte):

  1. : - in voll qualifizierte Namen (std::cout)
  2. <, > - in dem Namen der Vorlage Spezialisierungen
  3. +, -, *, / und andere Sonderzeichen - in den Namen der überladenen Operatoren

Wahrscheinlich genug, würden alte Linker Schwierigkeiten haben, mit solchen Zeichen in Symbole Namen zu tun, damit die C++ Compiler mussten diese Zeichen unter Verwendung der sicheren Teilmenge codieren.

Nichtfunktionseinheiten in C++ (nämlich - Namespace-Variablen, statische Datenelemente von nicht-Vorlage und Template-Klassen) können die Zeichen in ihrem Namen :, < und > haben. Wenn wir nur C und C++ betrachten, müssen Variablen auch eine Sprachverknüpfung haben. Wenn jedoch der vollständig qualifizierte Name einer C++ - Variablen (ohne das führende globale Namespacepräfix) die genannten Zeichen nicht enthält, stimmt der Name des Symbols mit dem Quellnamen überein. Als Ergebnis kann ich nicht an einen Fall denken, wenn die Angabe der "C" -Verknüpfung für eine Variable einen Unterschied macht.

Im Prinzip ist die Sprache Verknüpfung Spezifikation ermöglicht Namen von Modulen zusammengestellt von anderen Programmiersprachen zu importieren (obwohl, wie erwähnt in Ihrem Angebote, das ist die Implementierung definiert). Wenn Sie schon einmal mit einem solchen Fremdsprachenmodul und beziehen sich auf eine „globale“ Variable darin müssen miteinander verknüpfen, werden Sie es zuerst in der Quelldatei deklarieren müssen die Sprache Verknüpfungsvorschrift mit:

extern "Sci++" { 
    MemAllocFuncPtr Solver##Config##Malloc; 

    // Won't the '#' chararcters in the identifier name confuse the C++ compiler? 
    // Maybe C++ will need to be enhanced as below: 
    using SciPPSolverConfigMalloc = Solver##Config##Malloc; 
} 

Aber ich don Ich glaube nicht, dass Sie in der Praxis auf so etwas stoßen werden.

Verwandte Themen