Uso de void en el parámetro de función

Posible duplicado:
C void argumentos

Acabo de empezar con C y no puedo encontrar respuesta a esto …

¿Hay alguna diferencia entre

int foo() { } int foo(void) { } 

¿Cuál debería preferir y por qué?

Tenga en cuenta que esta pregunta también se int main : int main . Debería ser: int main o int main(void) cuando no quiero ningún argumento de línea de comando.

Las dos formas canónicas de main son, de acuerdo con el estándar (ver C99 sección 5.1.2.2.2 “Inicio del progtwig”):

 int main (void); int main (int argc, char *argv[]); // or equivalent such as char **argv 

Otros están específicamente permitidos pero esos son los requeridos.

En cuanto a la forma preferida entre fn(void) y fn() , prefiero la primera ya que me gusta declarar explícitamente que no hay parámetros.

También hay una sutil diferencia. C99 sección 6.7.5.3 “Declaradores de función”, párrafo 10, establece:

El caso especial de un parámetro sin nombre de tipo void como el único elemento en la lista especifica que la función no tiene parámetros.

El párrafo 14 de esa misma sección muestra la única diferencia:

Una lista de identificadores declara solo los identificadores de los parámetros de la función. Una lista vacía en un declarador de función que forma parte de una definición de esa función especifica que la función no tiene parámetros. La lista vacía en un declarador de función que no forma parte de una definición de esa función especifica que no se proporciona información sobre el número o los tipos de parámetros.

En otras palabras, significa lo mismo que void en la definición de la función, pero no significa eso en un declarador independiente (es decir, el prototipo). int fn(); significa que aún no se conoce información sobre los parámetros, pero int fn(void); Significa que no hay parámetros.

Eso significa que:

 int fn(); int fn (int x) { return x; } int main (void) { return fn(0); } 

es válido pero:

 int fn(void); int fn (int x) { return x; } int main (void) { return fn(0); } 

no es.

Además de la respuesta de paxdiablo, que cubre el lenguaje C y por lo tanto la pregunta del OP, puede valer la pena señalar que el “estilo vacío” se considera una mala práctica en C ++, al menos por Bjarne Stroustrup.

Las razones por las que están puramente relacionadas con el estilo, pero el uso de void como parámetro de función en realidad se prohibió en C ++ en los primeros días antes de la estandarización de ISO. Sin embargo, finalmente se permitió que la syntax del vacío proporcionara compatibilidad con C.

Así que para resumir esto:

  • En los progtwigs de C, use f(void) porque impone una escritura más estricta. (argumento racional)
  • En los progtwigs de C ++, use f() , o alterará a varios gurús de C ++. (argumento irracional)

No, no hay diferencia. Algunos comstackdores de C antiguos se quejarían de la ausencia de vacío en ese caso, pero no hay razón para hacerlo en C o C ++ moderno.

Independientemente de si utiliza o no los argumentos de la línea de comandos, la firma de main () incluye los parámetros que permitirían el acceso a los argumentos de la línea de comandos.

Ver la firma como un contrato con la persona que llama, no un anuncio de lo que realmente utiliza la implementación.

No hay diferencias entre las afirmaciones.

Si escribe int main(void) , esta statement le dice al comstackdor que main no contiene ningún argumento.

Y de manera similar, en el caso de main() o int main() , nuevamente el comstackdor entiende que main no contiene ningún argumento. Pero, en el primer caso, le está diciendo forzosamente al comstackdor, mientras que en la segunda statement el comstackdor entiende automáticamente.

Son los mismos, pero el preferido es int foo() { }