Domanda

mi sono imbattuto in questa domanda durante la digitazione man 2 open. Si dice che ci sono due tipi di apertura, una con due argomenti, e una con tre! ultima volta che ho controllato non siamo riusciti a funzioni in C. Come hanno fatto questo sovraccarico? hanno scritto in C ++?

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
È stato utile?

Soluzione

No, hanno solo usato Funzione Variadica.

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

Questo rende il mode opzionale ultimo argomento. I prototipi mostrano solo come deve essere utilizzata la funzione, non l'interfaccia attuale.

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 corretta prototipo come sopra .

Altri suggerimenti

Per quello che vale, la pagina di manuale non è corretta. I prototipi mostra:

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

sono non equivalente al prototipo corretta:

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 destra) farà sì che il vostro programma di avere un comportamento indefinito. (E questo non è solo teorica, ma sarà probabilmente riuscirà a funzionare su x86_64 e altre piattaforme con pass-by-registrarsi ABI).

Che la pagina man stava cercando di esprimere (e facendo un lavoro molto povero di) è che la parte variadic della lista degli argomenti di open può essere vuoto o un singolo argomento di tipo mode_t, dove l'assenza o la presenza di l'argomento opzionale dipende sul valore della flags.

No, hanno scritto in C, utilizzando varargs.

stdarg.h , dove ci sono esempi.

Una funzione variadic può leggere tanti argomenti a suo piacimento dalla puntini di sospensione . Qualsiasi argomento in più la funzione "non vuole" sono infatti scartato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top