Zu den Funktionstypen dieser Sprache gehören die „variadischen“ Funktionen. Diese Funktionstypen haben die Flexibilität, eine dynamische oder variable Anzahl von Eingabeargumenten zu enthalten.
In diesem Linux -Hinweis Artikel, der va_arg Das Makro, das eine grundlegende Komponente dieses Funktionstyps ist und zum Abrufen der Daten aus den Eingabemarions verwendet wird, wird ausführlich erläutert.
Wir werden eine detaillierte Erklärung seiner Operation und Syntax sehen. Dann werden wir das, was wir gelernt haben, in einem praktischen Beispiel in die Praxis umsetzen, in dem wir Schritt für Schritt eine variadische Funktion mit Codefragmenten und Bildern erstellen, die zeigen, wie die va_arg Makro funktioniert in der C -Sprache.
VA_ARG MACRO SYNTAX
Geben Sie va_arg ein (va_list ap, Typ)Definition einer variadischen Funktion
Bevor wir uns näher auf das Makro einlassen va_arg, Schauen wir uns einen kurzen Blick darauf an, was eine variadische Funktion ist.
Diese Funktionen haben keine feste Anzahl von Eingabeargumenten, aber die Anzahl dieser Argumente wird an das angepasst, was der Programmierer mit jedem Anruf sendet.
Ein Beispiel hier.
Als nächstes werden wir sehen, wie eine variadische Funktion definiert wird:
Typ Funktion (Typ Variable,…);Wie wir in der Definition sehen, müssen wir beim Erstellen einer Funktion dieses Typs in seiner Deklaration mindestens ein deklariertes Eingabebuchargument und sein Typ angeben, gefolgt von einer von Kommas getrennten Ellipse, die die Variablen oder unbekannte Argumente darstellt.
Die Variablen und Makros, die die variadischen Funktionen verwenden, wie z va_arg, sind in der „Stdarg definiert.H ”Kopfball. Um sie zu benutzen, müssen wir sie in unsere aufnehmen “.c ”Code oder seinen Kopf wie folgt:
#enthaltenSehen wir uns als nächst.
Eingabeargumente und Makros einer variadischen Funktion
In variadischen Funktionen werden eine Reihe von Makros und variablen Typen verwendet, um die Eingabeargumente zu verarbeiten, die der Programmierer mit jedem Aufruf sendet. Diese Makros und ihre Verwendung innerhalb der Funktion sind unten gezeigt.
VA_LIST APDas AP -Objekt ist vom Typ va_list und speichert Informationen zu den Eingabemitteln. Anschließend weist es auf die aktuelle Position in der Reihenfolge der Listeneingabedaten hin.
Einmal deklariert, muss das VA_List -Objekt mit dem VA_Start -Makro initialisiert werden.
void va_start (va_list ap, last);Der Makro va_start wird zuerst aufgerufen, wenn eine variadische Funktion aufgerufen wird. Es initialisiert den Objekt -AP, das auf das erste unbekannte Argument in der Liste hinweist.
Geben Sie va_arg ein (va_list ap, type);Dieses Makro gibt das nächste Eingangsargument zurück, auf das AP aus der Argumentliste ausgerichtet ist. Der zurückgegebene Datentyp ist in Typ angegeben.
Sobald VA_ARG die Daten abruft.
Dieses Makro gibt keinen Standardwert zurück, der angibt, dass die Liste der Eingabeargumente sein Ende erreicht hat. Der Programmierer muss also sicherstellen, dass eine sichere Methode erstellt wird, die angibt.
Eine sicher.
void va_end (va_list ap);Sobald alle Argumente abgerufen wurden, muss jeder Zyklus von VA_Start mit VA_end beendet werden, bevor die variadische Funktion zurückgibt. Andernfalls finden Sie Informationen zum Stapel mit den Daten des aktuellen Aufrufs, die im nächsten Anruf der Funktion zu Fehlern führen können
Wir haben bereits jedes der Makros gesehen, die Teil des Arguments in einer variadischen Funktion sind. Lassen Sie uns nun ein Beispiel dafür sehen, wie die Verwendung der Verwendung der Verwendung va_arg Makro zum Abrufen von Daten aus den Eingabargumenten wird in dieser Art von Funktion implementiert.
So erstellen Sie Schritt für Schritt eine variadische Funktion und holen Sie seine Eingabemargumente mit dem Makro va_arg () in der C -Sprache ab
In diesem Beispiel erläutern wir Schritt für Schritt, wie Sie eine variadische Funktion erstellen und ihre Eingabeberechtigung abrufen - mithilfe des Makro va_arg.
Im ersten Schritt erstellen wir die variadische Funktion, die wir get_arguments () nennen werden ().
Sowohl die Ausgabe als auch das deklarierte Eingangsargument arg_1 werden vom Typ Double sein. Die Aussage wird so aussehen:
double get_arguments (double arg_1,…);Nachdem wir die Funktion mit ihren Ausgangs- und Eingangstypen deklariert haben, setzen wir mit der Entwicklung des Funktionskörpers fort.
Im nächsten Schritt erstellen wir ein Array von 10 Elementen vom Typ Double mit dem Namen get_arg. In diesem Array werden wir die Daten des Eingabarguments speichern, die wir mit dem Makro abrufen werden va_arg.
Wir werden auch die Variable „A“ erstellen, die vom Typ int ist und als Kennung für die Elemente des GET_ARG -Arrays dient.
double get_arg [10];Im nächsten Schritt erstellen wir ein Objekt vom Typ VA_LIST, das wir "AP" nennen werden.
Dieses Objekt wird mit dem Makro va_start initialisiert und als erstes Argument geleitet, dem Namen des zuvor erstellten Objekts 'AP'; und als zweites Argument der Name der zuletzt bekannten Eingabevariablen, in diesem Fall "arg_1".
va_list ap;Es ist wichtig zu beachten, dass das erste Argument und in diesem Fall das einzige, das der Funktion bekannt ist.
In diesem Fall speichern wir es in Element Nummer 1 des GET_ARG -Arrays.
get_arg [a] = r1;Erstellen Sie als nächstes eine Weile Schleife, um die Eingabeargumente mit dem Makro abzurufen va_arg.
Wiederholen Sie dies in dieser Schleife, bis der Makro VA_ARG den Wert -1 oder "E" erhält, was der Indikator für das "letzte Argument" ist.
In jedem Zyklus der Schleife wird die Nachricht „Argument abgerufen:“ von der Funktion printf () gedruckt, gefolgt vom Wert der abgerufenen Daten.
Dann wird die Kennung „A“ durch 1 und das Makro erhöht va_arg wird aufgerufen, das das nächste Eingabargument abruft und es im Array -Element get_arg speichert, auf das von „A“ verwiesen wird.
während (get_arg [a] != e)Wenn alle Daten abgerufen wurden und das Programm die Schleife verlassen hat, müssen wir das Listenobjekt „AP“ beenden, das wir zu Beginn der Funktion mit dem Makro va_end erstellt haben und den Namen dieses Objekts als Eingabemargument übergeben haben.
va_end (ap);Als Nächst.
#enthaltenDas Bild unten zeigt die Befehlskonsole mit den abgerufenen Eingabemitteln. In diesem Fall wurde die Funktion mit zwei Eingabeargumenten aufgerufen.
Die Daten wurden für einen Aufruf mit fünf Eingabemargentum abgerufen.
Probleme und Lösungen beim Abrufen von Eingabedaten mit dem va_arg Makro
Das Hauptproblem, auf das wir bei der Entwicklung einer variadischen Funktion stoßen werden, ist, dass das Makro va_arg hat keine Methode, um den Programmierer über das Ende der Liste der Eingabeberechnen zu informieren. Sobald alle im Anruf gesendeten Daten abgerufen wurden, gibt dieses Makro jedes Mal, wenn es auf unbestimmte Zeit aufgerufen wird
Dies bedeutet, dass Sie nicht nur falsche Ergebnisse erzielen, sondern in Fällen, in denen das Datenab Abrufen geschleudert wird, wird ein Überlauf vorhanden. Daher muss der Programmierer eine Methode entwickeln, um das Ende der Argumente in der Liste zu erkennen. Eine der Methoden kann darin bestehen, eine Konstante als das letzte Argument zu verwenden, das das Ende der Liste angibt.
Eine andere Methode besteht darin, als erstes Argument die Anzahl der Parameter anzugeben, die jedes Mal gesendet werden müssen, wenn die variadische Funktion aufgerufen wird.
Abschluss
In diesem lInux -Hinweis Artikel, wir haben Ihnen eine detaillierte und vollständige Erklärung dafür gegeben va_arg Makro in der C -Sprache.
Wir haben auch die Verwendung der anderen Makros, die Teil der Datenwiederherstellung in dieser Funktion sind. Weitere Artikel wie diese finden Sie in der Linux -Hinweis -Suchmaschine.