如何修复“'struct _IO_FILE'没有名为'_file'的成员”?

时间:2019-06-12 19:25:35

标签: c linux compiler-errors

我有一个用于编译为*.o文件的程序版本,但现在没有,并且给出了编译器错误。

我试图在Linux上使用gcc编译器编译我的代码,但编译失败。

#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 个答案:

答案 0 :(得分:3)

从不使用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)而不是{{ 1}},其中前者更具可移植性。它还可以改善格式设置,以便其他人可以根据需要读取您的代码。

答案 1 :(得分:3)

现代化代码。原始版本似乎针对某些古老的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;
}