c++ - command line arguments python
¿Hay alguna diferencia entre foo(void) y foo() en C++ o C? (4)
Considere estas dos definiciones de funciones:
void foo() { }
void foo(void) { }
¿Hay alguna diferencia entre estos dos? Si no es así, ¿por qué existe el argumento void
? ¿Razones estéticas?
En C :
-
void foo()
significa "una funciónfoo
toma un número no especificado de argumentos de tipo no especificado" -
void foo(void)
significa "una funciónfoo
que nofoo
argumentos"
En C ++ :
-
void foo()
significa "una funciónfoo
que nofoo
argumentos" -
void foo(void)
significa "una funciónfoo
que nofoo
argumentos"
Al escribir foo(void)
, por lo tanto, logramos la misma interpretación en ambos idiomas y hacemos que nuestros encabezados sean multilingües (aunque generalmente necesitamos hacer algunas cosas más para hacer que sean verdaderamente extern "C"
si estamos compilando C ++).
En C, se usa un vacío en una referencia de función vacía para que el compilador tenga un prototipo, y ese prototipo no tenga "argumentos". En C ++, no tiene que decirle al compilador que tiene un prototipo porque no puede omitir el prototipo.
Me doy cuenta de que su pregunta pertenece a C ++, pero cuando se trata de C, la respuesta se puede encontrar en K&R, páginas 72-73:
Además, si una declaración de función no incluye argumentos, como en
double atof();
eso también significa que no se debe asumir nada sobre los argumentos de atof; Todas las comprobaciones de parámetros están desactivadas. Este significado especial de la lista de argumentos vacíos está destinado a permitir que los programas C más antiguos se compilen con compiladores nuevos. Pero es una mala idea usarlo con nuevos programas. Si la función toma argumentos, declararlos; Si no toma argumentos, use void.
C ++ 11 N3337 borrador estándar
No hay diferencia.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Anexo C "Compatibilidad" C.1.7 Cláusula 8: los declaradores dicen:
8.3.5 Cambio: En C ++, una función declarada con una lista de parámetros vacía no tiene argumentos. En C, una lista de parámetros vacía significa que el número y el tipo de los argumentos de la función son desconocidos.
Ejemplo:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Justificación: Esto es para evitar llamadas de función erróneas (es decir, llamadas de función con el número o tipo de argumentos incorrectos).
Efecto en la característica original: cambio a la semántica de la característica bien definida. Esta característica fue marcada como "obsolescente" en C.
8.5.3 funciones dice:
4. La cláusula de declaración de parámetros determina los argumentos que se pueden especificar y su procesamiento cuando se llama a la función. [...] Si la cláusula-declaración-parámetro está vacía, la función no toma argumentos. La lista de parámetros (nula) es equivalente a la lista de parámetros vacía.
C99
Como lo menciona C ++ 11, int f()
no especifica nada acerca de los argumentos, y es obsoleto.
Puede llevar a código de trabajo o UB.
He interpretado el estándar C99 en detalle en: https://.com/a/36292431/895245