Kann ich eine Funktion neu definieren oder prüfen, ob sie existiert?

8

Ich habe eine Frage zur (Neu-) Definition von Funktionen. Mein Ziel ist ein Skript, in dem ich eine Funktion definieren kann oder nicht. So:

%Vor%

UND ohne die Funktion, nur:

%Vor%

Jemand eine Idee?

    
Tim 02.08.2011, 18:28
quelle

8 Antworten

16

Sie können dies in GCC mit seiner schwachen Funktionsattribut-Erweiterung tun:

%Vor%

Dies funktioniert auch dann, wenn func() in einer anderen .c-Datei oder einer Bibliothek definiert ist.

    
bdonlan 02.08.2011, 18:40
quelle
5

So ungefähr, denke ich. Habe Funktionszeiger nicht viel benutzt, deshalb habe ich vielleicht die Syntax etwas falsch verstanden.

%Vor%     
JAB 02.08.2011 18:34
quelle
4

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.

    
Lee Louviere 02.08.2011 18:37
quelle
3

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.

    
Brian Gordon 02.08.2011 18:34
quelle
1

Einführung

Ich vermute, dass Sie das versuchen:

  • Zwei Module, 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.

Variante 1

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:

a.h

%Vor%

a.c

%Vor%

b.c

%Vor%

c.c

%Vor%

Fazit

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.

Variante 2

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:

a.h

%Vor%

a.c

%Vor%

b.c

%Vor%

b_dummy.c

%Vor%

c.c

%Vor%

c_dummy.c

%Vor%

Fazit

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 ...!

Bootnote

Dies ist eine Menge einfacher in C ++, wo Sie sehr einfach ein Modulregistrierungssystem mit std::map s und Konstruktoren schreiben können.

    
quelle
0

In C? Nur mit dem Präprozessor wie in anderen Antworten angegeben.

C ist keine dynamische Sprache wie etwa Python.

    
MRAB 02.08.2011 18:39
quelle
0

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.

    
Caleb 02.08.2011 18:42
quelle
0

Wenn Sie keine Compiler-spezifische Erweiterung beachten, können Sie __if_exists :

verwenden %Vor%

Dies funktioniert standardmäßig in msvc und in clang, wenn Sie das Flag -fms-extensions verwenden.

    
kritzikratzi 07.08.2017 11:09
quelle

Tags und Links