Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';";gcc-墙“;“警告”;如果(ptr<;0)";?_C_Pointers_Gcc_Gcc Warning - Fatal编程技术网

为什么';";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
一起使用。