Как я могу исправить "struct _IO_FILE" не имеет члена с именем "_file" "? - PullRequest
2 голосов
/ 12 июня 2019

У меня есть версия программы, которая раньше компилировалась в файл *.o, но теперь этого не происходит, и выдает ошибку компилятора.

Я попытался скомпилировать свой код с помощью компилятора gcc наLinux, и компиляция завершается неудачно.

#include <stdio.h>
int isatty();

long isatty_(lio_number)
long *lio_number;
{
        int file_desc;

        if ((*lio_number)==5)
        {
                file_desc = stdin->_file;
                return isatty(file_desc);
        }
        else
                return 0;
}

Я ожидаю, что команда gcc -c isatty.c выдаст isatty.o, но это не так.Вместо этого я получаю это сообщение:

isatty.c: In function ‘isatty_’:
isatty.c:11: error: ‘struct _IO_FILE’ has no member named ‘_file’

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Модернизируйте код. Оригинал, кажется, нацелен на какой-то древний Unix. Это должно работать на более поздних POSIX-совместимых системах, поскольку практически каждая такая система должна обеспечивать функцию fileno () . Изменение кода на стандартный C также является хорошей идеей.

Поэтому используйте fileno(), включите <unistd.h> вместо объявления вперед isatty() и используйте стандартные объявления параметров функции C:

#include <stdio.h>
#include <unistd.h>

long isatty_(long *lio_number)
{
    if (*lio_number == 5)
    {
        return isatty(fileno(stdin));
    }
    return 0;
}
3 голосов
/ 12 июня 2019

Никогда не используйте элементы структуры FILE.

Используйте fileno(stdin) вместо stdin->_file.

Элемент _file является специфичным для MinGW именем файладескриптор, в то время как fileno является широко поддерживаемой POSIX-совместимой функцией.

Наряду с этим, вы можете захотеть #include <unistd.h> вместо явного определения isatty.

Если вы 'По какой-то причине мы ограничены в написании вашего кода, не ожидайте, что он будет переносимым.В противном случае это должно сработать:

#include <stdio.h>
#include <unistd.h>

long isatty_(long *lio_number)
{
        int file_desc;

        if (*lio_number == 5)
        {
                file_desc = fileno(stdin);
                return isatty(file_desc);
        }
        else
        {
                return 0;
        }
}

Это изменение состоит в том, что он включает unistd.h, который предоставляет объявление для isatty, он включает типы аргументов в определении функции и использует fileno(stdin) вместо stdin->_file, из которых первый гораздо более портативный.Это также улучшает форматирование, чтобы другие могли читать ваш код, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...