为什么';";gcc-墙“;“警告”;如果(ptr<;0)";?
(说来话长……你可以直接跳到最后的问题……) 我需要使用为什么';";gcc-墙“;“警告”;如果(ptr<;0)";?,c,pointers,gcc,gcc-warning,C,Pointers,Gcc,Gcc Warning,(说来话长……你可以直接跳到最后的问题……) 我需要使用realpath(3),所以我写了一个简单的例子来尝试: $> cat realpath.c #include <stdio.h> #include <limits.h> #include <stdlib.h> int main(int argc, char * argv[]) { char pathname[PATH_MAX]; if (realpath(argv[1], pa
realpath(3)
,所以我写了一个简单的例子来尝试:
$> cat realpath.c
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
char pathname[PATH_MAX];
if (realpath(argv[1], pathname) < 0) {
perror("realpath");
return 1;
}
printf("%s\n", pathname);
return 0;
}
$> gcc -Wall -o realpath realpath.c
$> ls /xxx
ls: cannot access '/xxx': No such file or directory
$> ./realpath /xxx/foo/bar
/xxx
$>cat realpath.c
#包括
#包括
#包括
int main(int argc,char*argv[])
{
字符路径名[PATH_MAX];
if(realpath(argv[1],路径名)<0){
perror(“realpath”);
返回1;
}
printf(“%s\n”,路径名);
返回0;
}
$>gcc-Wall-o realpath realpath.c
$>ls/xxx
ls:无法访问“/xxx”:没有这样的文件或目录
$>。/realpath/xxx/foo/bar
/xxx
/realpath/xxx/foo/bar
的结果令我惊讶。根据测试结果,使用enoint
失败更有意义。我甚至参考了POSIX,没有找到答案。过了一段时间,我重新阅读了手册,发现realpath(3)
返回char*
而不是int
。我真的被gcc激怒了
问题:
那么为什么gcc(即使使用-Wall
)不警告如果(ptr<0)
那么,为什么gcc(即使使用-Wall
)不报告if(ptr<0)
指定给-Wall
标志的名称实际上具有误导性,因为它不能启用所有编译器警告
您需要通过-Wextra
。这样,您将得到以下编译器警告:
warning: ordered comparison of pointer with integer zero [-Wextra]
gcc-Wall
不会启用所有gcc警告有关详细信息,请参阅
在您的情况下,需要添加-Wextra
标志:
gcc-Wall-Wextra-o realpath realpath.c
根据:
这将启用-Wall
未启用的一些额外警告标志
选项-Wextra
还打印以下情况的警告消息:
- 指针与整数0进行比较,其值为=。
- [……]
相关:因为
0
是一个完全合法的空指针常量。您正在将realpath
的结果(指针)与空指针进行比较。这并不合法,但此冲突不需要诊断。因为将指针与0进行比较定义良好。对等式进行比较几乎是有意义的,但编译器似乎并没有真正的特例到特例来警告(至少我的没有,可能是一些较新版本的gcc有)。对我来说,if(ptr==0/*NULL*/)
或if(ptr!=0)
。什么时候对>0
或<0
有意义?我相信gcc有充分的理由不在默认情况下发出警告。否?我个人将-std=
与-Wall-Wextra-Wpedantic-Wconversion
一起使用。