C Variable ohne Namen?

Bender86

Lieutenant
Registriert
Jan. 2007
Beiträge
722
Ich bin grade durch die Suche nach einem Fehler auf eine seltsame Deklaration in meiner stdio.h (OS X Mountain Lion) gestoßen:

Code:
#if __DARWIN_C_LEVEL >= 200112L || defined(_C99_SOURCE) || defined(__cplusplus)
__BEGIN_DECLS
int	 snprintf(char * __restrict, size_t, const char * __restrict, ...) __printflike(3, 4);
int	 vfscanf(FILE * __restrict, const char * __restrict, va_list) __scanflike(2, 0);
int	 vscanf(const char * __restrict, va_list) __scanflike(1, 0);
int	 vsnprintf(char * __restrict, size_t, const char * __restrict, va_list) __printflike(3, 0);
int	 vsscanf(const char * __restrict, const char * __restrict, va_list) __scanflike(2, 0);
__END_DECLS
#endif /* __DARWIN_C_LEVEL >= 200112L || defined(_C99_SOURCE) || defined(__cplusplus) */

Sehe ich das richtig, dass in Zeile 3 die Methode eine Variable vom Typ "size_t" erwartet, die Variable aber keinen Namen bekommt? Darf man das überhaupt? Was für einen Sinn würde es machen wenn man auf die Variable nicht zugreifen kann?

Kann mir das jemand erklären?
 
Das sind lediglich Signaturen von Funktionen. Dabei spielen die Bezeichner gar keine Rolle, da sie an dieser Stelle dem Compiler keinen Mehrwert bieten.

eine Funktion
void doSomething1(int i);
hat die selbe Signatur wie
void doSomething2(int j);

Nimm mal zwei Funktionen:
Code:
void a(int i)
{
  printf("1");
}

void a(int j)
{
  printf("2");
}
was soll bei a(1) aufgerufen werden? Der Bezeichner i oder j für den ersten Parameter bringt in der Signatur einer Funktionen eben keinen Mehrwert für den Compiler. Das heißt nicht, dass er nicht angegeben werden muss. Aber er hat an sich keinen "Nutzen", er muss nicht mal mit dem Bezeichner übereinstimmen, der bei der Implementierung der Funktion verwendet wird... (passt nicht auf das Beispiel hier, weil hier direkt die Implementierung ist)

Edit: Mumpitzelchen hat das richtige Wort genannt, Dekaration. Also bei der Deklaration geht es an sich nur darum die Signatur der Funktion zu definieren. Und die Bezeichner gehören eben nicht zur Signatur.
 
Zuletzt bearbeitet:
Das ist ja auch nur die Deklaration. Da braucht es keinen Variablennamen.
In der Definition der Funktion hat sie natürlich einen:
int snprintf(char *str, size_t size, const char *format, ...); aus man 3 snprintf.
 
Ok, dass das nur Deklarationen sind ist mir schon klar. :) Wobei ich es dort bisher immer mit Variablennamen gesehen habe. Daher war meine Annahme die müssen auch bei der Deklaration irgendeinen Namen haben, aber dem ist wohl nicht so.

Danke für die Antworten!
 
es macht schon sinn in die deklarationen die variablen namen mit aufzunehmen, damit man aus deren namen die verwendung besser ableiten kann.

für das kompilieren aber ist das überflüssig. es ist optional.
 
Was bei der Deklaration geht,

Code:
void foo(int);

funktioniert überdies auch bei der Definition:

Code:
void foo(int)
{
}

Benötigt man also den Parameter nicht, muss man ihm auch keinen Namen zuweisen. Am Aufruf der Funktion ändern sich jedoch nichts, der Parameter muss in jedem Fall angegeben werden.

Code:
foo(0);
 
Zurück
Oben