2010-10-17 6 views
16

Me encontré con esta pregunta al escribir man 2 open. ¡Dice que hay dos tipos de abierto, uno con dos args y uno con tres! La última vez que revisé no pudimos sobrecargar las funciones en C. ¿Cómo lo hicieron? ¿Escribieron en C++?¿Por qué 'man 2 open' dice que hay dos tipos de open?

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

Respuesta

19

No, solo utilizan la función variadic.

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

Esto hace que el último argumento mode opcional. Los prototipos solo muestran cómo se debe usar la función, no la interfaz real.

Por supuesto, a diferencia de sobrecarga real, el compilador no puede escribir a comprobar el argumento mode, por lo que el usuario tiene que tener mucho cuidado para asegurar que se transmiten sólo 2 o 3 argumentos, y el tercero argumento debe ser una mode_t.


Por cierto, si marca la man 2 open para BSD (incluyendo OS X) que muestra el correct prototype as above.

+1

Si el compilador conoce POSIX o conoce los tipos de argumento de la función a través de una extensión de idioma, puede hacer la comprobación. Si gcc/glibc no están haciendo eso, no me sorprendería ver que lo agreguen pronto, al igual que el argumento 'printf'. –

+0

Gracias, realmente ayudó. –

7

No, escribieron en C, using varargs.

Consulte stdarg.h, donde hay ejemplos.

Una función variadic puede leer tantos argumentos como desee del ellipsis. Cualquier argumento extra la función "no quiere" se descarta de hecho.

8

Por lo que vale, la página de manual es incorrecta. Los prototipos se muestra:

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

son no equivalente al prototipo correcta:

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

Usando las incorrectas que presta (por ejemplo, si prototipos de la función de sí mismo en lugar de incluir la cabecera de la derecha) hará que su programa tenga un comportamiento indefinido. (Y esto no es solo teórico, probablemente no se ejecutará en x86_64 y otras plataformas con ABI pass-by-register.)

Lo que la página man estaba tratando de expresar (y haciendo un trabajo muy pobre) es que la parte variada de la lista de argumentos de open puede ser vacía o un solo argumento de tipo mode_t, donde la ausencia o presencia del argumento opcional depende del valor de flags.