【发布时间】:2021-01-19 11:56:33
【问题描述】:
在编译以下代码时,我收到了来自 gcc 编译器的奇怪警告:
int main( int argc, char *argv[] )
{
int fdm;
pid_t pid;
fdm = posix_openpt( O_RDWR );
pid = fork();
if(pid==0)
{
if(grantpt(fdm) ==-1)
{
perror("grantpt");
exit(EXIT_FAILURE);
}
if(unlockpt(fdm) ==-1)
{
perror("unlockpt");
exit(EXIT_FAILURE);
}
char* name = ptsname(fdm);
int fds = open(name,O_RDWR);
if(fds ==-1)
{
perror("open");
exit(EXIT_FAILURE);
}
close(0);
close(1);
close(2);
dup(fds);
dup(fds);
dup(fds);
execlp("cat","cat",NULL);
perror("cat");
exit(EXIT_FAILURE);
}
printf( "main: copied %d bytes\n", dblCOPY( STDIN_FILENO, fdm, fdm, STDOUT_FILENO ) );
return 0;
}
这是警告:
warning: initialization makes pointer from integer without a cast [enabled by default]
char* name = ptsname(fdm);
奇怪的是 ptsname 函数返回 char 指针,而不是编译器声称的整数,那么可能是什么问题?
【问题讨论】:
-
可能没有
ptsname的声明。你还没有显示#include的。 -
在没有信息(没有原型(缺少包含文件?))的情况下,编译器假定
ptsname()返回一个int...所以你有char* name = <intvalue>;和警告 -
C 默认为 int 用于未声明的函数。不要忘记功能测试宏
-
VTC 不完整、美观且简单。您从未展示过您的
main()函数/文件应该如何知道ptsname()的签名,所以它不知道,除非您打开几乎不是现代的 C 标准/警告,否则编译器会尝试为您猜测,然后警告它的猜测。 -
我在任何地方都没有看到
#include <stdlib.h>...