statisch vs extern "C" / "C ++"
Was ist der Unterschied zwischen einer statischen member-Funktion und eine extern "C" linkage-Funktion ? Zum Beispiel, wenn Sie mit "makecontext" in C++, muss ich übergeben Sie einen Zeiger auf die Funktion. Google empfiehlt die Verwendung von extern "C" Verknüpfung für Sie, weil "makecontext" ist C. Aber ich fand heraus, dass die Verwendung von statischen als gut funktioniert. Bin ich einfach nur Glück oder...
class X {
public:
static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
vs
extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
EDIT: Kann Sie zeigen ein compiler oder Architektur, wo die statischen member-version nicht funktioniert (und es ist kein bug im compiler) ?
InformationsquelleAutor der Frage Giovanni Funchal | 2009-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie sind einfach nur glücklich 🙂 Die extern "C" ist eine Sprache, die Verknüpfung für die C-Sprache, die jeder C++ - compiler unterstützen, neben extern "C++", das ist die Standardeinstellung. Compiler können unterstützt andere Sprache verbindungen. Der GCC zum Beispiel unterstützt extern "Java", der es erlaubt die Anbindung von java-code (aber das ist Recht umständlich).
extern "C" sagt dem compiler, dass die Funktion aufrufbar ist, die durch C-code. Können, aber nicht müssen, gehören die entsprechenden Aufruf-Konvention und der entsprechenden C language name mangling (manchmal auch als "Dekoration") unter anderem abhängig von der Implementierung. Wenn Sie eine statische member-Funktion die Aufrufkonvention für es ist die der C++ - compiler. Oft sind Sie die gleichen wie für den C-compiler von dieser Plattform - also sagte ich, Sie sind einfach nur glücklich. Wenn Sie eine C-API und übergeben Sie eine Funktion Zeiger, besser immer setzen Sie ein, um eine deklarierte Funktion mit extern "C" wie
Obwohl die Funktion Zeiger Typ nicht enthalten ist die Verknüpfung Spezifikation, sondern sieht aus wie
Die Verbindung ist integraler Bestandteil der Art - man kann einfach nicht Ausdrücken, es direkt und ohne typedef:
Der Comeau C++ compiler im strikten Modus emittieren, einen Fehler, zum Beispiel, wenn Sie versuchen, weisen Sie die Adresse der extern "C" Funktion oben, um eine
(void(*)())
beause dies ist ein Zeiger auf eine Funktion mit C++ linkage.InformationsquelleAutor der Antwort Johannes Schaub - litb
Beachten Sie, dass
extern C
ist die empfohlen Weg von C/C++ Interoperabilität. Hier ist der Meister darüber zu reden. Hinzufügen eduffy Antwort: beachten Sie, dass statische Funktionen und Variablen in den globalen Namensraum sind veraltet. Eine anonyme namespace zumindest.Zurück
extern C
: wenn Sie nicht extern C Sie müssen wissen, die genaue entstellten Namen und verwenden Sie es. Das ist viel mehr ein Schmerz.InformationsquelleAutor der Antwort dirkgently
extern "C"
deaktiviert die C++ - compiler das name-mangling (für überlastung).Wenn Sie deklarieren eine Funktion in A.cpp zu
static
dann kann es nicht gefunden werden B.cpp (es ist das überbleibsel C, und es hat den gleichen Effekt der Umsetzung einer Funktion in einem anonymen namespace).InformationsquelleAutor der Antwort eduffy
Meiste von dem, was
extern "C"
tut, ist weitgehend compiler abhängig. Viele Plattformen ändern Sie die name-mangling und Aufruf-Konvention auf der Grundlage der Erklärung, aber keine, die durch die Norm festgelegten. Wirklich das einzige, was der standard verlangt, dass der code im block aufrufbar ist, die aus C-Funktionen. Für Ihre spezielle Frage, die Norm sagt:Dies bedeutet
extern "C" void proxy(int i) {}
und/*extern "C++"*/void proxy(int i) {}
haben verschiedene Arten, und als ein Ergebnis Zeiger auf diese Funktionen hätte andere Arten als gut. Der compiler hat nicht den code für den gleichen Grund würde es nicht scheitern ein großes Stück Arbeit wie:Dieser code funktioniert möglicherweise auf einige Plattform, aber das bedeutet nicht, es funktioniert auf einer anderen Plattform (auch wenn der compiler vollständig standardkonform). Sie nutzen, wie Ihr bestimmte Plattform funktioniert, das wäre ok, wenn Sie nicht besorgt über das schreiben portablen code.
Als für statische member-Funktionen, Sie sind nicht erforderlich, um eine
this
Zeiger, damit der compiler ist frei, Sie zu behandeln als eine nicht-member-Funktion. Nochmal, das Verhalten hier ist Plattform-spezifisch.InformationsquelleAutor der Antwort Andrew Khosravian
Generell
Storage-Klassen:
storage-Klassen werden verwendet, um anzugeben, Dauer und Umfang einer Variablen oder identifier.
Dauer:
Dauer zeigt die Lebensdauer einer Variablen.
Umfang:
Umfang zeigt die Sichtbarkeit der Variablen.
Statische Speicher-Klasse:
Die statische Speicherklasse verwendet wird, deklarieren Sie einen Bezeichner eine lokale variable, die entweder eine Funktion oder eine Datei und das gibt es, und behält Ihren Wert nach der Kontrolle übergibt, von wo Sie deklariert wurde. Diese storage-Klasse hat eine Dauer, die dauerhaft ist. Eine deklarierte variable dieser Klasse behält Ihren Wert von einem Funktionsaufruf zum nächsten. Der Geltungsbereich ist lokal. Eine variable ist nur bekannt, von der Funktion in der Sie deklariert ist, die innerhalb oder wenn Global definiert, in einer Datei, es ist bekannt, gesehen oder nur von den Funktionen innerhalb der Datei. Diese Speicher-Klasse garantiert, dass die Deklaration der Variablen auch initialisiert die variable auf null oder alle bits aus.
Extern-Speicherklasse:
Den extern-Speicherklasse verwendet wird, deklarieren Sie eine Globale variable, die bekannt sein wird, um die Funktionen in eine Datei und in der Lage ist, alle bekannten Funktionen in einem Programm. Diese storage-Klasse hat eine Dauer, die dauerhaft ist. Eine variable dieser Klasse behält Ihren Wert, bis Sie geändert werden, indem Sie eine andere Zuordnung. Der Geltungsbereich ist global. Eine variable kann bekannt oder gesehen, indem alle Funktionen in einem Programm.
InformationsquelleAutor der Antwort Durai Amuthan.H