Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

__scanf_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 __scanf_args

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

void foo()

{

  int i;

  my_scanf(5, "falsches Argument %d\n", i);

}

Das Pragma muss vor der Deklaration einer Funktion stehen. Für diese Funktion wird angenommen, dass sie der Funktion scanf ä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 scanf.

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.

Ein Fehler wird ausgegeben, wenn die Größe von Formatanweisung und Argument nicht passt. Es würde dann entweder nur ein Teil der Variablen geschrieben, oder es würden Bytes nach der Variablen überschrieben. Auch gibt es einen Fehler, wenn das Argument kein Zeiger ist.

Für andere Differenzen wird eine Warnung oder Note ausgegeben.

In dem Beispiel oben kommt ein Fehler. Die Formatanweisung %d erwartet ein Argument vom Typ int *, es wurde jedoch ein int übergeben. Es fehlt ein Adress-Operator &.

Für die CRTE-Funktionen scanf, fscanf und sscanf wird diese Prüfung ebenfalls ausgeführt.