tipos - Función de sobrecarga en C
tipos de funciones en c (5)
Hoy, mirando la página de manual de open()
, he notado que esta función está ''sobrecargada'':
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
No pensé que fuera posible en C. ¿Cuál es el ''truco'' para lograr esto?
MÁS TARDE:
Por lo tanto, no es realmente una sobrecarga, porque al usar varargs, solo puede proporcionar múltiples argumentos del mismo tipo. Entonces, ¿es mode_t
detrás de escena un int?
"el modo debe especificarse cuando O_CREAT está en las banderas, y de lo contrario se ignora".
extern int open (__const char *__file, int __oflag, ...)
Utiliza varargs
y solo carga el argumento de la variable de modo si __oflag
contiene O_CREAT
.
C hace posible escribir una función con un número variable de argumentos , como printf
.
Dicho esto, no hay una forma confiable y multiplataforma en C para escribir una función que tome exactamente 2 o 3 argumentos; en general debes hacer algo como
some_function(5, 6, 7, NULL);
some_function(5, 6, 8, 2, 5, NULL);
En otras palabras, debe tener un argumento "sentinal" de terminación. Alternativamente, podría incluir el número de parámetros de alguna manera en un parámetro anterior, como
another_func(2, "hello", "world");
another_func(3, "goodbye", "cruel", "world");
La familia de funciones printf
toma este enfoque; el primer parámetro de formato contiene el número de parámetros adicionales necesarios; por ejemplo, con printf("%f %f", 5.6, 7.11)
sabe que debe haber 2 parámetros de flotación. Sin embargo, esto sería de alguna manera inseguro en una función de biblioteca definida por el usuario, ya que si dijera my_printf("%s %f %f %f %s", 5.6)
entonces podría obtener seguridades o algo peor. Afortunadamente, la mayoría de los compiladores de C revisarán sus llamadas a printf
en tiempo de compilación para evitar este tipo de problema.
En el caso de open
, se declara que la función tiene argumentos variables, y el tercer parámetro solo se verifica si O_CREAT
está configurado. Entonces, así es como "con seguridad" determina si un tercer argumento está presente. Puse "de forma segura" entre comillas porque técnicamente no hay forma de que Open pueda saber cuántos parámetros se pasaron. Por ejemplo, las siguientes llamadas se compilarían sin ningún error o advertencia:
open("foo.txt", 5, "not an integer", 7); // extra and invalid parameters
open("bar.txt", O_CREAT); // third parameter is missing
Está utilizando argumentos variables . Esas declaraciones aparecen solo en la página de manual, ya que esas 2 son las únicas formas en que debe llamar a open (). La función C real se declarará como, por ejemplo,
int open(const char *pathname,int flags,...);
Con argumentos variables, los argumentos no necesitan ser del mismo tipo. printf
es el ejemplo obvio de esto.
En el caso de open (), el primer argumento variable debe ser mode_t if '' flags
contienen la marca O_CREAT porque la implementación de open () espera que sea mode_t (que detrás de las escenas probablemente sea un int sin signo o un unsigned long, pero eso no tiene nada que ver con varargs)
Puedes falsificarlo usando la lista de argumentos variables con ...
int function(int x, ...);
respuesta muy corta - varargs