Gibt es eine Möglichkeit, Standardargumente für eine Funktion in C anzugeben?
c
arguments
default-parameters
Nathaniel Flath
quelle
quelle
Antworten:
Nicht wirklich. Die einzige Möglichkeit wäre , eine varargs-Funktion zu schreiben und Standardwerte für Argumente, die der Aufrufer nicht übergibt, manuell einzugeben .
quelle
open(2)
Systemaufruf verwendet dies für ein optionales Argument, das abhängig von den erforderlichen Argumenten vorhanden sein kann, undprintf(3)
liest eine Formatzeichenfolge, die angibt, wie viele Argumente vorhanden sein werden. Beide verwenden Varargs ziemlich sicher und effektiv, und obwohl man sie sicherlich vermasseln kann,printf()
scheint sie besonders beliebt zu sein.Wow, hier ist jeder so ein Pessimist. Die Antwort ist ja.
Es ist nicht trivial: Am Ende haben wir die Kernfunktion, eine unterstützende Struktur, eine Wrapper-Funktion und ein Makro um die Wrapper-Funktion. In meiner Arbeit habe ich eine Reihe von Makros, um all dies zu automatisieren. Sobald Sie den Ablauf verstanden haben, fällt es Ihnen leicht, dasselbe zu tun.
Ich habe dies an anderer Stelle geschrieben. Hier ist ein detaillierter externer Link, der die Zusammenfassung hier ergänzt: http://modelingwithdata.org/arch/00000022.htm
Wir möchten uns umdrehen
in eine Funktion, die Standardeinstellungen übernimmt (i = 8, x = 3,14). Definieren Sie eine Begleitstruktur:
Benennen Sie Ihre Funktion um
f_base
und definieren Sie eine Wrapper-Funktion, die Standardeinstellungen festlegt und die Basis aufruft:Fügen Sie nun ein Makro hinzu, indem Sie die variadischen Makros von C verwenden. Auf diese Weise müssen Benutzer nicht wissen, dass sie tatsächlich eine
f_args
Struktur füllen, und denken, dass sie das Übliche tun:OK, jetzt würde alles funktionieren:
Überprüfen Sie die Regeln, wie zusammengesetzte Initialisierer Standardeinstellungen für die genauen Regeln festlegen.
Eine Sache, die nicht funktioniert:
f(0)
weil wir nicht zwischen einem fehlenden Wert und Null unterscheiden können. Nach meiner Erfahrung ist dies etwas, auf das Sie achten müssen, das Sie jedoch bei Bedarf erledigen können - die Hälfte der Zeit, in der Ihr Standardwert wirklich Null ist.Ich habe mir die Mühe gemacht, dies aufzuschreiben, weil ich denke, dass benannte Argumente und Standardeinstellungen das Codieren in C wirklich einfacher machen und noch mehr Spaß machen. Und C ist großartig, weil es so einfach ist und immer noch genug da ist, um all dies zu ermöglichen.
quelle
{}
(leerer Initialisierer) ein Fehler C99 ist.#define vrange(...) CALL(range,(param){.from=1, .to=100, .step=1, __VA_ARGS__})
Ja. :-) Aber nicht so, wie man es erwarten würde.
Leider können Sie mit C keine Methoden überladen, sodass Sie am Ende zwei verschiedene Funktionen haben. Wenn Sie jedoch f2 aufrufen, rufen Sie tatsächlich f1 mit einem Standardwert auf. Dies ist eine "Wiederholen Sie sich nicht" -Lösung, mit der Sie vermeiden können, vorhandenen Code zu kopieren / einzufügen.
quelle
Wir können Funktionen erstellen, die benannte Parameter (nur) für Standardwerte verwenden. Dies ist eine Fortsetzung der Antwort von bk.
Der C99-Standard definiert, dass spätere Namen in der Initialisierung vorherige Elemente überschreiben. Wir können auch einige Standard-Positionsparameter haben, ändern Sie einfach das Makro und die Funktionssignatur entsprechend. Die Standardwertparameter können nur im benannten Parameterstil verwendet werden.
Programmausgabe:
quelle
OpenCV verwendet so etwas wie:
Wenn der Benutzer nicht weiß, was er schreiben soll, kann dieser Trick hilfreich sein:
quelle
Nein.
Nicht einmal der neueste C99-Standard unterstützt dies.
quelle
Nein, das ist eine C ++ - Sprachfunktion.
quelle
Kurze Antwort: Nein.
Etwas längere Antwort: Es gibt eine alte, alte Problemumgehung, bei der Sie eine Zeichenfolge übergeben, die Sie nach optionalen Argumenten analysieren :
Dabei kann opt ein Paar "Name = Wert" oder etwas anderes enthalten, das Sie gerne aufrufen würden
Offensichtlich ist dies nur gelegentlich nützlich. Im Allgemeinen, wenn Sie eine einzelne Schnittstelle zu einer Funktionsfamilie wünschen.
Sie finden diesen Ansatz immer noch in Teilchenphysik-Codes, die von professionellen Programmen in C ++ (wie zum Beispiel ROOT ) geschrieben wurden. Der Hauptvorteil besteht darin, dass es nahezu unbegrenzt verlängert werden kann, während die Rückenkompatibilität erhalten bleibt.
quelle
struct
und den Anrufer eine erstellen lassen, die Felder für verschiedene Optionen ausfüllen und sie dann als Adresse übergeben oderNULL
als Standardoptionen übergeben.Der wahrscheinlich beste Weg, dies zu tun (was in Ihrem Fall je nach Ihrer Situation möglich oder nicht möglich ist), besteht darin, zu C ++ zu wechseln und es als "besseres C" zu verwenden. Sie können C ++ verwenden, ohne Klassen, Vorlagen, Operatorüberladung oder andere erweiterte Funktionen zu verwenden.
Dadurch erhalten Sie eine Variante von C mit Funktionsüberladung und Standardparametern (und allen anderen Funktionen, die Sie verwendet haben). Sie müssen nur ein wenig diszipliniert sein, wenn Sie es wirklich ernst meinen, nur eine eingeschränkte Teilmenge von C ++ zu verwenden.
Viele Leute werden sagen, dass es eine schreckliche Idee ist, C ++ auf diese Weise zu verwenden, und sie könnten einen Punkt haben. Aber es ist nur eine Meinung; Ich denke, es ist gültig, Funktionen von C ++ zu verwenden, mit denen Sie vertraut sind, ohne sich auf das Ganze einlassen zu müssen. Ich denke, ein wesentlicher Grund für den Erfolg von C ++ ist, dass es in den Anfängen von sehr vielen Programmierern genau auf diese Weise verwendet wurde.
quelle
Eine weitere Option verwendet
struct
s:quelle
Nein.
quelle
20202020
hexadezimal ist, aber wie schreibe ich es?Ein weiterer Trick mit Makros:
Wenn nur ein Argument übergeben wird, wird
b
der Standardwert empfangen (in diesem Fall 15).quelle
Nein, aber Sie können eine Reihe von Funktionen (oder Makros) verwenden, um die Standardargumente zu verwenden:
quelle
Ja, mit den Funktionen von C99 können Sie dies tun. Dies funktioniert ohne Definition neuer Datenstrukturen oder so und ohne dass die Funktion zur Laufzeit entscheiden muss, wie sie aufgerufen wurde, und ohne Rechenaufwand.
Eine ausführliche Erklärung finden Sie in meinem Beitrag unter
http://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99/
Jens
quelle
Im Allgemeinen nein, aber in gcc Sie können den letzten Parameter von funcA () mit einem Makro optional machen.
In funcB () verwende ich einen speziellen Wert (-1), um zu signalisieren, dass ich den Standardwert für den Parameter 'b' benötige.
quelle
Ich habe Jens Gustedts Antwort so verbessert , dass:
variadic.h:
Vereinfachtes Nutzungsszenario:
Und mit _Generic:
Und mit variadischer Funktionsnamenauswahl, die nicht mit _Generic kombiniert werden kann:
quelle
JA
Durch Makros
3 Parameter:
Wenn Sie das 4. Argument möchten, muss ein zusätzliches my_func3 hinzugefügt werden. Beachten Sie die Änderungen in VAR_FUNC, my_func2 und my_func
4 Parameter:
Einzige Ausnahme, dass Float- Variablen keine Standardwerte zugewiesen werden können ( es sei denn, es handelt sich um das letzte Argument wie im Fall mit 3 Parametern ), da sie einen Punkt ('.') Benötigen, der in Makroargumenten nicht akzeptiert wird. Kann aber eine Problemumgehung finden, wie im Makro my_func2 ( Fall mit 4 Parametern) zu sehen )
Programm
Ausgabe:
quelle
Ja, Sie können etwas Simulaires tun. Hier müssen Sie die verschiedenen Argumentlisten kennen, die Sie erhalten können, aber Sie haben dieselbe Funktion wie alle anderen.
quelle
Warum können wir das nicht tun?
Geben Sie dem optionalen Argument einen Standardwert. Auf diese Weise muss der Aufrufer der Funktion nicht unbedingt den Wert des Arguments übergeben. Das Argument nimmt den Standardwert an. Und leicht wird dieses Argument für den Kunden optional.
Zum Beispiel
void foo (int a, int b = 0);
Hier ist b ein optionales Argument.
quelle