Überprüfung, ob eine Funktion eine C-Verknüpfung zur Kompilierungszeit hat [nicht lösbar]

8

Gibt es eine Möglichkeit zu überprüfen, ob eine bestimmte Funktion mit C-Verknüpfung (das heißt mit extern "C" ) zur Kompilierzeit deklariert wird?

Ich entwickle ein Plugin-System. Jedes Plugin kann dem Plugin-Ladecode Factory-Funktionen zur Verfügung stellen. Dies muss jedoch über den Namen (und die anschließende Verwendung von GetProcAddress oder dlsym ) geschehen. Dies erfordert, dass die Funktionen mit C-Verknüpfung deklariert werden, um eine Namensänderung zu verhindern. Es wäre schön, in der Lage zu sein, einen Compiler-Fehler zu werfen, wenn die referenzierte Funktion mit C ++ - Verknüpfung deklariert wird (im Gegensatz zur Feststellung, dass zur Laufzeit eine Funktion mit diesem Namen nicht existiert).

Hier ist ein vereinfachtes Beispiel, was ich meine:

%Vor%

Gibt es eine mögliche Implementierung von is_c_linkage , die einen Compilerfehler für die zweite Funktion auslöst, aber nicht die erste? Ich bin mir nicht sicher, ob das möglich ist (obwohl es als Compiler-Erweiterung existieren könnte, von der ich immer noch gerne wissen würde). Danke.

    
scjohnno 29.05.2010, 19:40
quelle

2 Antworten

2

Ich stimme Jonathan Leffler zu, dass dies wahrscheinlich nicht standardmässig möglich ist. Vielleicht wäre es etwas möglich, je nach Compiler und sogar Version des Compilers, aber Sie müssten experimentieren, um mögliche Ansätze zu ermitteln und akzeptieren, dass das Verhalten des Compilers wahrscheinlich unbeabsichtigt war und in späteren Versionen "behoben" werden konnte / p>

Mit g++ Version 4.4.4 unter Debian Squeeze können Sie beispielsweise einen Compilerfehler für Funktionen, die nicht stdcall sind, mit diesem Ansatz auslösen:

%Vor%

g++ -std=c++0x kann diesen Code nicht kompilieren, weil:

  

SO2936360.cpp: 17: Fehler: ungültige Konvertierung von 'void () ()' zu 'void () ()'

Zeile 17 ist die Deklaration von pFn2 . Wenn ich diese Deklaration loslasse, ist die Kompilierung erfolgreich.

Leider funktioniert diese Technik nicht mit cdecl .

    
Daniel Trebbien 29.05.2010 20:25
quelle
0

Wie wäre es mit Unix / Linux, das resultierende Binary mit 'nm' zu analysieren und nach Symbolnamen zu suchen? Ich nehme an, es ist nicht das, was du meintest, aber trotzdem ist es eine Art Kompilierzeit.

    
anatoli 29.05.2010 20:32
quelle

Tags und Links