Verwenden Sie Funktionszeiger, legen Sie sie dynamisch basierend auf den Laufzeitbedingungen fest, und prüfen Sie auf Nullzeiger oder umbrechen Sie sie in Methoden, die diese Überprüfung für Sie durchführen.
Nur Option in C, an die ich denken kann.
In C ++ können Sie Vorlagen und DLLs kombinieren, um sie zur Laufzeit dynamisch zu definieren.
Die einzige Möglichkeit, "eine Funktion zu definieren oder nicht zu definieren", ist C-Präprozessordirektiven. Zum Beispiel:
%Vor% Um diese "Variablen" zu setzen, verwenden Sie #define some_name
Das Problem ist, dass all dies zur Kompilierzeit (davor) geschehen muss, also kann es nicht mit einer if
Anweisung wie in deinem Beispiel gemacht werden. Wenn Sie möchten, dass eine if-Anweisung Ihren Programmfluss steuert, verwenden Sie ihn einfach und versuchen Sie nicht, Funktionen umzubenennen oder Funktionszeiger oder etwas anderes zu verwenden.
Ich vermute, dass Sie das versuchen:
a.o
und b.o
b.o
enthält eine Definition für void foo()
a.o
ruft void foo()
nur auf, wenn b.o
auch mit der endgültigen ausführbaren Datei verknüpft ist. Dies könnte für ein "plugin" System nützlich sein.
Sie können es mit Funktionszeigern simulieren. Ich weiß nicht genug C, um das in richtigen C-Code zu schreiben, aber Pseudocode sieht so aus:
Nun können Sie in b.o
und / oder c.o
verknüpfen, wie Sie möchten, und int main()
ruft nur bar()
und / oder ayb()
auf, falls sie existieren.
Experimentieren Sie mit Variationen zu diesem Thema, wenn es Ihnen vielleicht nützlich erscheint. Insbesondere wenn Sie nur eine spezifische Anzahl von bedingt definierten Funktionen haben, könnten Sie eine Reihe von einzelnen Funktionszeigern anstelle einer Liste verwenden:
Jetzt entweder link b.o
oder b_dummy.o
; und entweder link c.o
oder c_dummy.o
.
Ich hoffe, Sie bekommen die allgemeine Idee, trotzdem ...!
Dies ist eine Menge einfacher in C ++, wo Sie sehr einfach ein Modulregistrierungssystem mit std::map
s und Konstruktoren schreiben können.
Der richtige Weg, um das zu tun, was Sie in C erwarten, ist die Verwendung von Funktionszeigern . Du kannst die Adresse einer Funktion nehmen, sie einer Variablen zuweisen, sie auf Null testen, usw. Allerdings ist einfaches altes C keine sehr dynamische Sprache; Sie könnten besser eine andere Sprache verwenden.
Wenn Sie keine Compiler-spezifische Erweiterung beachten, können Sie __if_exists
:
Dies funktioniert standardmäßig in msvc und in clang, wenn Sie das Flag -fms-extensions
verwenden.