Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

__printf_args-Pragma

&pagelevel(4)&pagelevel

Dieses Pragma wird genutzt, um eine zusätzliche Parameter-Überprüfung für eine Funktion zu aktivieren. Ein Beispiel wäre:

#pragma __printf_args

void my_printf(int arg1, const char *format, ...);

void foo()

{

  my_printf(5, "falsches Argument %s\n", 42);

}

Das Pragma muss vor der Deklaration einer Funktion stehen. Für diese Funktion wird angenommen, dass sie der Funktion printf ähnelt. Bedingung ist, dass die Funktion eine variable Anzahl von Argumenten hat. Es wird dann angenommen, dass der letzte feste Parameter einen Formatstring bezeichnet, der die Typen der folgenden Parameter beschreibt. Die Formatanweisungen in diesem Formatstring haben die gleiche Semantik wie bei der Funktion printf.

Wird beim Aufruf der Funktion dieser Parameter mit einem String-Literal versorgt, so prüft der Compiler den Typ aller folgenden Argumente. Der Typ wird mit der dazu passenden Formatanweisung verglichen. Passen diese nicht zusammen, so wird eine Meldung ausgegeben.

Das Meldungsgewicht hängt von der Art der Differenz ab. Wenn die Ausführung des Funktionsaufrufs nur zu einer seltsamen Ausgabe führt, gibt es eine Warnung. Dies ist etwa der Fall, wenn eine Gleitpunktzahl mit %d ausgegeben werden soll. Eine Note kommt, wenn statt int ein unsigned int oder long genutzt wird (oder ähnliche Fälle).

Ein Fehler wird ausgegeben, wenn die Ausführung andere Probleme machen kann. Wenn die Größe von Formatanweisung und Argument nicht passt, werden alle folgenden Argumente nicht sauber zugeordnet. Auch gibt es einen Fehler, wenn ein Zeiger erwartet wird, aber eine Zahl als Argument verwendet wird.

In dem Beispiel oben kommt ein Fehler. Die Formatanweisung %s erwartet ein Argument vom Typ char *, es wurde jedoch ein int übergeben.

Für die CRTE-Funktionen printf, fprintf, sprintf und snprintf wird diese Prüfung ebenfalls ausgeführt.