3 Stimmen

Ist es möglich, zu prüfen, ob eine Funktion mit einer Zeichenkette als Name existiert?(C++)

Ich möchte so etwas machen können:

if (Is_Function("helloworld")
    // Run code

7voto

Chris Eberle Punkte 46685

Einfache Antwort: nein

Komplizierte Antwort: Ja, wenn die Debugsymbole eingeschaltet sind und Sie einige Hilfsfunktionen schreiben, um die Debugsymbole zu durchsuchen. Aber das ist wirklich schrecklich, fehlerhaft (Funktionen können automatisch eingefügt werden und sind dann auf magische Weise nicht mehr in der Symboltabelle zu finden) und vor allem funktioniert es nicht mehr, sobald Sie die Release-Version des Programms erstellen.

Endgültige Antwort: keine

3voto

Wyzard Punkte 32772

Nicht im normalen Sinne, da C++ keine Reflexion unterstützt. Sie könnten das Programm mit Debug-Informationen kompilieren und es sich selbst öffnen lassen und seine Symboltabelle lesen, wie es ein Debugger tun würde, aber das ist wahrscheinlich mehr Mühe als es wert ist.

Aber warum müssen Sie das Vorhandensein einer Funktion zur Laufzeit feststellen? Das ist doch zur Kompilierzeit bekannt.

Wenn Sie den Teil herausnehmen können, der pourrait die Funktion in einer dynamischen Bibliothek enthalten, können Sie sie zur Laufzeit öffnen und eine Symbolsuche für sie durchführen. (Auf einem Linux-System würden Sie dlopen() y dlsym() Es gibt Äquivalente auf anderen Plattformen, aber ich kenne ihre Namen nicht aus dem Stegreif). Dies sagt Ihnen, ob der Name als Symbol existiert, aber nicht, ob es sich um eine Funktion handelt.

2voto

Chris Dodd Punkte 109402

Eine Technik, die Sie auf ELF-basierten Systemen (Linux und die meisten Unix-Varianten, einschließlich MacOS X) verwenden können, ist die Verknüpfung mit -rdynamic und rufen dann dlsym(RTLD_DEFAULT, "helloworld") um einen Zeiger auf die Funktion zu erhalten helloworld wenn sie in der aktuellen ausführbaren Datei oder einer geladenen Shared Lib vorhanden ist. Dies hat Probleme mit C++ aufgrund von Namensverwechslungen, funktioniert also wirklich nur für Funktionen, die mit extern "C" oder in C-Code.

0voto

arne Punkte 4303

Nun, Qt tut etwas Ähnliches, wenn Signale und Slots verwendet werden, aber dann werden die Funktionen in einer Map registriert, die durch eine Verstümmelung ihres Namens indiziert wird (iirc). Diese Registrierung wird durch ihren "MetaObject Compiler" erreicht, der im Grunde ein Präprozessor/Codegenerator ist und statisch arbeitet.

Je nachdem, was Sie tun möchten, können Sie Qt.

Eine andere Möglichkeit wäre, eine gemeinsam genutzte Bibliothek zu kompilieren und dlsym zu verwenden, falls auf Ihrem System verfügbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X