C-Verknüpfung für den an die C-Bibliothek übergebenen Funktionszeiger

8

Mein Fall ist ziemlich einfach: Ich möchte, dass mein C ++ - Programm Unix-Signale verarbeitet. Dazu stellt glibc eine Funktion in signal.h namens sigaction bereit, die erwartet, dass sie einen Funktionszeiger als zweites Argument erhält.

%Vor%

Meine Frage ist: Ist der extern "C" Linkbezeichner notwendig?

Bonusfrage: Kann uponSignal static deklariert werden?

    
qdii 13.05.2013, 11:28
quelle

2 Antworten

6
  

Meine Frage ist: Ist der extern "C" Linkbezeichner notwendig?

Für maximale Portabilität, ja; Der C ++ - Standard garantiert nur die Interoperabilität mit C über die Funktionen extern "C" .

Praktisch, nein; Die meisten sinnvollen ABIs (einschließlich des von glibc verwendeten GNU ABI) verwenden die gleiche Aufrufkonvention für C- und C ++ - Nichtmitgliedsfunktionen (und statische Mitglieder), sodass extern "C" nur benötigt wird, um den Funktionsnamen zwischen Sprachen zu teilen.

  

Bonusfrage: Kann uponSignal als statisch deklariert werden?

Ja. Die externe Verknüpfung wird nur benötigt, um von anderen Übersetzungseinheiten namentlich auf die Funktion zuzugreifen; Es ist nicht notwendig, die Funktion über einen Funktionszeiger aufzurufen.

    
Mike Seymour 13.05.2013 11:53
quelle
4

extern C ist nur notwendig, wenn Sie Ihre Symbole aus Ihrer Binärdatei exportieren oder sie aus einer anderen Binärdatei importieren (normalerweise in beiden Fällen eine gemeinsam genutzte Bibliothek), um Namensfehlern zu vermeiden.

Dies ist nicht der Fall. Sie verknüpfen uponSignal nicht über verschiedene Binärdateien, so dass Sie extern C nicht benötigen. Sie übergeben lediglich die Adresse Ihrer Funktion an sigaction von einer Funktion, die die Adresse von uponSignal bereits kennt, da sie (anscheinend) Teil derselben Übersetzungseinheit oder mindestens der gleichen Binärdatei sind.

  

Bonusfrage: Kann uponSignal als static deklariert werden?

Sicher, wenn du willst. uponSignal benötigt sowieso keine externe Verknüpfung.

    
syam 13.05.2013 11:45
quelle

Tags und Links