¿Por qué tener un `int

4 minutos de lectura

(float)` apunta a un `int foo()` activa una advertencia, pero tener un `int
(doble)` apunta a que no?

justANewb destaca con el avatar de usuario de Ucrania

int foo() { return 0; }
int main()
{
    int (*float_function)(float) = foo;
}

justANewb apoya a Ucrania x86-64 GCC 12.2Tengo este fragmento de código: -WallCuando se compila usandoconproduce la advertencia (

Enlace [-Wincompatible-pointer-types]

): float advertencia: inicialización de ‘int double (flotante)’ del tipo de puntero incompatible ‘int()’Pero, cuando cambio de

int foo(){ return 0;}
int main()
{
    int (*double_function)(double) = foo;
}

a

(

Enlace

  • ):

    La advertencia ahora se ha ido.

    Pero creo que ambos deberían recibir una advertencia.

  • ¿Me equivoco en alguna parte? ¿Por qué GCC no se queja del segundo ejemplo?

    Para obtener información de fondo, hay una buena discusión sobre la compatibilidad del puntero de función aquí: stackoverflow.com/questions/559581/…

    – nielsen

  • 21 de enero a las 9:49

    Sabía la respuesta a esta pregunta (se debe a las promociones de argumentos predeterminados que se realizan en llamadas a funciones no prototipadas), pero no sabía la compatibilidad de tipos entre funciones no prototipadas y no prototipadas, así que gracias por publicar esta pregunta.

    – Una matriz de funciones


22 de enero a las 0:12
Relacionado, si no es un duplicado: compatibilidad de tipos de funciones que no incluyen un prototipo

int foo() – Martín R. int 22 de enero a las 16:54 float avatar de usuario de interjay doubleinterjay

se declara sin especificar sus parámetros. Esta es una característica obsoleta que le permite llamarla con cualquier argumento. Al llamar a la función, los argumentos enteros se promocionan a float (si es necesario), y int (*)(float)Se promueven argumentos para int (*)(double).

Debido a esto, es imposible que esta función reciba un int foo(void) parámetro, lo que lo hace incompatible con

pero no con double. int foo() {...} Si desea una función que no tome parámetros, declárela como

lo que lo hará incompatible con ambos. int foo(); Tenga en cuenta que incluso con

el código no es C válido porque […] es una definición de función, por lo que el compilador sabe que no tiene parámetros (consulte el comentario de chux a continuación para obtener la referencia estándar). La mayoría de los compiladores todavía lo permiten. […] Si lo reemplaza con una declaración

¿Ha sido útil esta solución?