¿Por qué recibo esta advertencia en “if (fd=fopen(fileName,”r”) == NULL)”?

1 minuto de lectura
FILE *fd;
if (fd=fopen(fileName,"r") == NULL)
{   
    printf("File failed to open");
    exit(1);
}

Este es un fragmento de código. Cuando lo compilo con gcc, recibo la siguiente advertencia: –

warning: assignment makes pointer from integer without a cast

cuando pongo fd=fopen(argv[2],”r”) entre paréntesis, el problema se resuelve ..

no soy capaz de entender ¿Dónde estoy convirtiendo un entero en un puntero? cuando no se ponen los corchetes.

Debido a las reglas de precedencia de operadores, la condición se interpreta como fd=(fopen(fileName,"r") == NULL). El resultado de == es entero, fd es un puntero, por lo tanto, el mensaje de error.

Considere la versión “extendida” de su código:

FILE *fd;
int ok;
fd = fopen(fileName, "r");
ok = fd == NULL;
// ...

¿Esperaría que la última línea se interpretara como (ok = fd) == NULLo ok = (fd == NULL)?

  • Esta respuesta en realidad explica la advertencia.

    –Richard Pennington

    22 de enero de 2010 a las 14:11

La precedencia del operador de igualdad es mayor que la del operador de asignación. Solo cambia tu código a:

FILE *fd;
if ((fd=fopen(fileName,"r")) == NULL)
{   
    printf("File failed to open");
    exit(1);
}

== tiene mayor precedencia que =por lo que compara el resultado de fopen() para NULLluego asigna eso a fd.

Necesita paréntesis alrededor de la tarea:

if ((fd=fopen(fileName,"r")) == NULL)
....

== tiene una prioridad más alta que =.

¿Por que recibo esta advertencia en if fdfopenfileNamer NULL
tim cooper

¿Has hecho lo siguiente?

#include <stdio.h>

Sin esto, el compilador asume que todas las funciones devuelven un int.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad