2010-10-17 8 views
16

Ich habe diese Frage bei der Eingabe von man 2 open. Es besagt, dass es zwei Arten von offenen gibt, eine mit zwei Argumenten und eine mit drei Argumenten! Als ich das letzte Mal nachprüfte, konnten wir Funktionen in C nicht überladen. Wie haben sie das gemacht? haben sie in C++ geschrieben?Warum sagt 'man 2 open', dass es zwei Arten von offenen gibt?

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

Antwort

19

Nein, sie haben nur variadic Funktion verwendet.

int open(const char * pathname, int flags, ...); 

Dies macht das letzte Argument mode optional. Die Prototypen zeigen nur, wie die Funktion verwendet werden sollte, nicht die tatsächliche Schnittstelle.

Natürlich, im Gegensatz zu echten Überlastung kann der Compiler nicht geben Sie das Kontroll mode Argument, so dass der Anwender vorsichtig sein, zusätzliche hat nur 2 oder 3 Argumente, um sicherzustellen, übergeben, und das dritte Argument ist ein mode_t sein.


BTW, wenn Sie die man 2 open für BSD (einschließlich OS X) überprüfen sie zeigt die correct prototype as above.

+1

Wenn der Compiler Kenntnis von POSIX hat oder über eine Spracherweiterung auf die Argumenttypen der Funktion aufmerksam gemacht wurde, kann er die Überprüfung durchführen. Wenn gcc/glibc das nicht schon macht, wäre ich nicht überrascht, wenn sie es bald hinzufügen würden, genau wie das Argument 'printf' überprüft. –

+0

Danke, es hat wirklich geholfen. –

7

Nein, sie schrieben in C, mit Varargs.

Check out stdarg.h, wo es Beispiele gibt.

Eine Variadic-Funktion kann so viele Argumente aus der ellipsis lesen, wie es mag. Alle zusätzlichen Argumente, die die Funktion "nicht will", werden tatsächlich verworfen.

8

Für was es wert ist, ist die man-Seite falsch. Die Prototypen es zeigt:

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

sind nicht entspricht dem richtigen Prototyp:

int open(const char * pathname, int flags, ...); 

die falschen diejenigen Mit ihm bietet (zB wenn Sie den Funktionsprototyp selbst statt, einschließlich des Rechts-Header) verursacht ein nicht definiertes Verhalten Ihres Programms. (Und das ist nicht nur theoretisch, es wird wahrscheinlich nicht auf x86_64 und anderen Plattformen mit Pass-by-Register-ABIs laufen.)

Was die Man-Seite versuchte auszudrücken (und macht einen sehr schlechten Job) ist dass der variadische Teil der Argumentliste von open entweder leer oder ein einzelnes mode_t Typargument sein kann, wobei das Fehlen oder Vorhandensein des optionalen Arguments vom Wert flags abhängt.

Verwandte Themen