(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.2
Tengo este fragmento de código: -Wall
Cuando 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
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 double
interjay
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
-
y coloque la definición en otro lugar, entonces lo anterior es correcto. En ese caso, la cotización estándar relevante (C17 6.7.6.3/15) es:
-Wstrict-prototypes
Para que dos tipos de funciones sean compatibles,-Wall
Si un tipo tiene una lista de tipos de parámetros y el otro tipo está especificado por un declarador de función que no forma parte de una definición de función y que contiene una lista de identificadores vacía,el tipo de cada parámetro deberá ser compatible con el tipo que resulte de la aplicación de las promociones de argumento por defecto.
Buena explicación. Tener una función declarada sin parámetros específicos a menudo puede generar confusión. Se puede detectar habilitando la advertencia.
-
(no, no habilita todas las advertencias). – nielsen
int foo(){ return 0;}
21 de enero a las 9:56int foo(void){ return 0;}
interjay, C11 § 6.7.6.3 14 tiene “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”. contradice Una funcióndefinición
como
-
debería ser el mismo que
-pedantic
. Sospecho que el compilador utilizado no sigue esta especificación.– chux – Reincorporar a Monica
21 de enero a las 12:15
-
@chux-ReinstateMonica Creo que tienes razón y esto no debería compilarse. Pero tanto gcc como clang permiten esto, incluso en
modo.
– interjay
-
21 de enero a las 12:39 @tstanisl “el tipo de cada parámetro debe ser compatible con el tipo que resulta de la aplicación de las promociones de argumentos predeterminados”. – del estándar (6.7.6.3/15), con respecto a la compatibilidad con un tipo de función sin prototipo. Además, incluso si el estándar lo permitiera, este es exactamente el tipo de cosas que se supone que deben detectar las advertencias. – interjay
-Wone-all-to-rule-them-all
21 de enero a las 15:27“(no, -Wall no habilita todas las advertencias)”
qué.
):
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