diferencia entre void y nada...

Pues tengo una curiosidad... sabeis la diferencia entre por jemplo en una clase poner un método así

void mostrar(void);
void mostar();

un compañero me dijo que era diferente el significado pero no lo sé. En la práctica suelo gastar la de () pero mis compañeros utilizan ambas.
En C++ es igual.

En C

void mostrar(void);
//no recibe parametros

void mostar();
//puede recibir los parametros que quieras

Creo que era algo así.
Sip, tienes razón.

Para optimizar un poco es conveniente siempre poner el void si se trata de una función sin argumentos.
parrincrisis escribió:void mostar();
//puede recibir los parametros que quieras


Entonces, ¿después cómo manipulas los parámetros recibidos?
Como sabras se pueden hacer funciones con numero indeterminado de parametros como printf.

Para declararla seria

int funcion(int a,...)

O algo parecido y luego hay funciones en stdarg.h para trabajar con los parametros.

Mira aqui viene un ejemplo.

http://www.conclase.net/c/curso/index.php?cap=020

Por cierto dice que al menos el primer parametro es conocido asi que ya me deja en la duda...
resumiendo entonces con void mostrar() si que se podrían pasar cualquier número de argumentos? creo que hace falta poner los 3 puntos...
Enlace explicando lo que dispone C99 respecto a las diferencias entre pasar como argumento void o declarar la función sin argumentos.

Explicación de los varargs (apta para noobs)

En mi opinión sólo hay diferencias si el compilador de C++ se ejecuta en modo estricto y las firmas de las funciones se sobrecargan mientras se usa código "extern 'c' {" o algo así. Aunque en realidad mezclar código de C y C++ y ejecutar el compilador en modo C99 estricto es un contrasentido.

Yo digo que se puede usar () y (void) indistintamente y mezclarlos sin problemas. Aún si caes en algúno de estos agujeros en la definición del estándar, cosa rara, es de esperar que el compilador te perdone.

Los varargs no tienen nada que ver, pero molan.
Las menciones a esto en el libro de Kernighan y Ritchie (2ª Edición):

Pag. 33 (Edición en Inglesa) / Pag. 36 (Edición en Español):

"Pero por compatibilidad con programas de C anteriores, el estándar toma a una lista vacía como una declaración al viejo estilo, y suspende toda revisión de listas de argumentos; para una lista explicitamente vacía debe emplearse la palabra void."

Pag. 73 (Edición en Ingles) / Pag. 81 (Edición en Español):

"Este significado especial de la lista de argumentos vacía se hace para permitir que los programas en C viejos se compilen con los nuevos compiladores. Pero es una mala táctica usar esto con programas nuevos. Si la función toma argumentos, decláreselos; si no los toma, use void.




Salu2
8 respuestas