Der folgende C ++ - Code wird mit Visual C ++ und g ++ kompiliert:
%Vor%Ist es gültig?
Wenn es gültig ist, da die Implementierung in einer separaten Übersetzungseinheit erfolgen kann, bedeutet das, dass eine statische Elementfunktion immer die gleiche Aufrufkonvention wie eine C-Funktion hat (und wenn nicht, wie bedeutet das nicht?) )?
C ++ 11 7.5 / 4 "Verbindungsspezifikationen"
Eine C-Sprachverknüpfung wird bei der Bestimmung der Sprachverknüpfung von ignoriert die Namen der Klassenmitglieder und der Funktionstyp des Klassenmembers Funktionen.
Ihr Beispiel ist also in dem Sinne gültig, dass es nicht fehlerhaft ist oder ein Fehler ist, aber extern "C"
sollte keine Auswirkungen auf S::foo()
oder T::foo()
haben.
Eine statische Elementfunktion hat dieselbe Aufrufkonvention wie eine C-Funktion. Aber, Name Mangling gilt. Selbst wenn Sie Ihr statisches Member als extern "C"
deklarieren, würde der Linker es wahrscheinlich nicht finden, wenn Sie versuchen, es mit dem C-Code zu verknüpfen, der diese Funktion aufruft.
Was Sie können können leicht einen Wrapper / Stub deklarieren, der den statischen Member von einer Plain-Funktion aufruft. Außerdem können Sie die Adresse der statischen Mitgliedsfunktion einem einfachen Funktionszeiger zuweisen.
Nein, es wird ignoriert, das Problem ist name mangling (Funktionsbenennung für die Verknüpfungsphase). Der Trick besteht also darin, eine C-Funktion zu definieren und Ihre statische C ++ - Methode als Stub zu verwenden, um sie wie folgt aufzurufen:
%Vor% Natürlich sollte S_foo_impl
in einem externen C-Modul definiert werden.
Tags und Links c c++ member-functions