C hace que sea posible escribir la función con un variable number of argument, como printf
.
Dicho esto, no existe una forma confiable y multiplataforma en C para escribir una función que toma exactamente 2 o 3 argumentos; en general, debe hacer algo como
some_function(5, 6, 7, NULL);
some_function(5, 6, 8, 2, 5, NULL);
En otras palabras, debe tener un argumento "final" de terminación. Como alternativa, puede 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");
El printf
familia de funciones de toma este enfoque; el primer parámetro de formato contiene el número de parámetros adicionales necesarios; p.ej. con printf("%f %f", 5.6, 7.11)
, sabe que debe haber 2 parámetros de flotación. Sin embargo, esto sería algo inseguro en una función de biblioteca definida por el usuario, ya que si dijera my_printf("%s %f %f %f %s", 5.6)
, podría obtener segfaults o algo peor. Afortunadamente, la mayoría de los compiladores C verificarán sus llamadas al printf
en tiempo de compilación para evitar este tipo de problema.
En el caso de open
, la función se declara como que tiene argumentos variables, y el tercer parámetro solo se marca si se establece O_CREAT
. Entonces, así es como "con seguridad" determina si un tercer argumento está presente. Puse "de manera segura" entre comillas porque técnicamente no hay forma de que Open sepa en tiempo de ejecución cuántos parámetros se pasaron realmente. Por ejemplo, las siguientes llamadas se compilan sin errores o advertencias:
open("foo.txt", 5, "not an integer", 7); // extra and invalid parameters
open("bar.txt", O_CREAT); // third parameter is missing
mode_t es de hecho un entero, pero se puede suministrar argumentos de diferentes tipos, en el supuesto de que sabe cómo interpretarlas. La familia de funciones printf hace esto, utilizando la cadena de formato para saber cómo interpretar sus argumentos adicionales, incluso cuando se escriben de manera diferente. Mi respuesta a continuación tiene algunos ejemplos que podrían aclarar esto. –
@Eli gracias, debo haber confundido eso con Java. –
Las funciones como esta se llaman funciones variadas. – Chris