tratamiento traductor tiene tengo síntomas que prohibidos prevenir natural manera ingles hacer google glaucoma evitar español debo debe cuando como alimentos c linux overloading manpage

traductor - ¿Por qué ''hombre 2 abierto'' dice que hay dos tipos de abierto?



status traductor google (3)

Me encontré con esta pregunta mientras escribía man 2 open . ¡Dice que hay dos tipos de abierto, uno con dos argumentos y otro con tres! la última vez que verifiqué no podíamos sobrecargar las funciones en C. ¿Cómo hicieron esto? ¿Escribieron en C ++?

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


No, escribieron en C, usando varargs.

Echa un vistazo a stdarg.h , donde hay ejemplos.

Una función variable puede leer tantos argumentos como quiera de los ellipsis . Cualquier argumento adicional que la función "no quiera" se descarta de hecho.


No, solo usaban la función variadica.

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

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

Por supuesto, a diferencia de la sobrecarga real, el compilador no puede verificar el argumento del mode , por lo que el usuario debe tener mucho cuidado para asegurarse de que solo se pasen 2 o 3 argumentos, y el tercer argumento debe ser un mode_t .

Por cierto, si marca el man 2 open para BSD (incluido OS X), se muestra el prototipo correcto como se muestra arriba .


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

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

No son equivalentes al prototipo correcto:

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

El uso de los incorrectos que proporciona (por ejemplo, si crea un prototipo de la función usted mismo en lugar de incluir el encabezado correcto) hará que su programa tenga un comportamiento indefinido. (Y esto no es solo teórico; es probable que no se ejecute en x86_64 y otras plataformas con ABI de paso por registro).

Lo que la página de manual intentaba expresar (y hacer un trabajo muy pobre) es que la parte variable 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 de El valor de las flags .