Ich möchte so etwas machen können:
if (Is_Function("helloworld")
// Run code
Ich möchte so etwas machen können:
if (Is_Function("helloworld")
// Run code
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
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.
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.
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 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.