statische Memberfunktion mit C-Sprachbindung?

8

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?) )?

Cheers and hth. - Alf 02.12.2015, 07:38
quelle

3 Antworten

8

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.

    
Michael Burr 02.12.2015, 07:56
quelle
4

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.

    
Hellmar Becker 02.12.2015 07:52
quelle
0

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.

    
Jean-Baptiste Yunès 02.12.2015 09:06
quelle

Tags und Links