Почему я получаю это предупреждение в "if (fd = fopen (fileName," r ") == NULL)"? - PullRequest
5 голосов
/ 22 января 2010
FILE *fd;
if (fd=fopen(fileName,"r") == NULL)
{   
    printf("File failed to open");
    exit(1);
}

Это фрагмент кода. Когда я компилирую его с помощью gcc, я получаю следующее предупреждение: -

warning: assignment makes pointer from integer without a cast

Когда я ставлю fd = fopen (argv [2], "r") в скобках, проблема решается ..

Я не могу понять , где я преобразовываю целое число в указатель , когда скобки не ставятся.

Ответы [ 6 ]

14 голосов
/ 22 января 2010

Из-за правил приоритета оператора условие интерпретируется как fd=(fopen(fileName,"r") == NULL). Результат == является целым числом, fd является указателем, таким образом, сообщение об ошибке.

Рассмотрим «расширенную» версию вашего кода:

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

Ожидаете ли вы, что последняя строка будет интерпретирована как (ok = fd) == NULL или ok = (fd == NULL)?

3 голосов
/ 22 января 2010

Приоритет оператора равенства выше, чем оператора присваивания. Просто измените свой код на:

FILE *fd;
if ((fd=fopen(fileName,"r")) == NULL)
{   
    printf("File failed to open");
    exit(1);
}
2 голосов
/ 22 января 2010

== имеет более высокий приоритет, чем =, поэтому он сравнивает результат fopen() с NULL, а затем присваивает его fd.

1 голос
/ 22 января 2010

== имеет более высокий приоритет, чем =.

1 голос
/ 22 января 2010

Вам необходимо заключить в скобки следующее назначение:

if ((fd=fopen(fileName,"r")) == NULL)
....
0 голосов
/ 22 января 2010

Вы сделали следующее?

#include <stdio.h>

Без этого компилятор предполагает, что все функции возвращают int.

...