我有一个用于编译为*.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’
答案 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;
}