c++ c arguments

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ón foo toma un número no especificado de argumentos de tipo no especificado"
  • void foo(void) significa "una función foo que no foo argumentos"

En C ++ :

  • void foo() significa "una función foo que no foo argumentos"
  • void foo(void) significa "una función foo que no foo 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