2010-10-17 12 views
16

Mi sono imbattuto in questa domanda durante la digitazione di man 2 open. Dice che ci sono due tipi di open, uno con due args e uno con tre! l'ultima volta che ho controllato non abbiamo potuto sovraccaricare le funzioni in C. Come hanno fatto? hanno scritto in C++?Perché "uomo 2 aperto" dice che ci sono due tipi di apertura?

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

risposta

19

No, hanno appena usato la funzione variadica.

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

Questo rende l'ultimo argomento mode facoltativo. I prototipi mostrano solo come dovrebbe essere usata la funzione, non l'interfaccia reale.

Naturalmente, a differenza di vero e proprio sovraccarico, il compilatore non può digitare controllare l'argomento mode, in modo che l'utente deve essere molto attenti a garantire solo 2 o 3 argomenti sono passati, e il 3 ° argomento deve essere un mode_t.


A proposito, se si seleziona la man 2 open per BSD (compreso OS X) mostra il correct prototype as above.

+1

Se il compilatore è a conoscenza di POSIX o è a conoscenza dei tipi di argomenti della funzione tramite un'estensione di lingua, può eseguire il controllo. Se gcc/glibc non lo sta già facendo, non sarei sorpreso di vederli aggiungerli presto, proprio come i controlli di argomento 'printf'. –

+0

Grazie, mi ha davvero aiutato. –

7

No, hanno scritto in C, utilizzando vararg.

Verificare stdarg.h, dove ci sono esempi.

Una funzione variad può leggere tutti gli argomenti che desidera dallo ellipsis. Eventuali argomenti extra la funzione "non vuole" sono infatti scartati.

8

Per quello che vale, la pagina man non è corretta. I prototipi si vede:

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

sono non equivalente alla corretta prototipo:

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

Utilizzando quelli non corretti che fornisce (ad esempio se si prototipi la funzione da soli, piuttosto che con l'indicazione dell'header a destra) farà sì che il tuo programma abbia un comportamento indefinito. (E questo non è solo teorico, probabilmente non riuscirà a funzionare su x86_64 e altre piattaforme con ABI pass-by-register.)

Ciò che la pagina man stava cercando di esprimere (e facendo un lavoro molto scarso di) è che la parte variadell'elenco degli argomenti di open può essere vuota o un singolo argomento di tipo mode_t, in cui l'assenza o la presenza dell'argomento facoltativo dipende dal valore di flags.