pyn*_*exj 2 c gcc pointers 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], 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
Run Code Online (Sandbox Code Playgroud)
结果./realpath /xxx/foo/bar让我感到惊讶.根据手册,失败更有意义ENOENT.我甚至提到了POSIX并没有找到答案.经过一段时间后,我重读了手册并找到了realpath(3)退货char *而不是int.我真的很恼火gcc.
那么为什么 gcc(甚至没有-Wall)警告过if (ptr < 0)呢?
Ron*_*eau 10
gcc -Wall没有启用GCC的所有警告! 有关更多信息,请参阅此问题.
在您的情况下,您需要添加-Wextra标志:
gcc -Wall -Wextra -o realpath realpath.c
Run Code Online (Sandbox Code Playgroud)
根据海湾合作委员会的文件:
这会启用一些未启用的额外警告标志
-Wall.该选项
-Wextra还会针对以下情况打印警告消息:
将指针与整数零与<,<=,>或> =进行比较.
[...]
那么为什么gcc(甚至没有
-Wall)报告警告if (ptr < 0)?
赋予该-Wall标志的名称实际上具有误导性,因为它不会启用所有编译器警告.
你需要通过-Wextra.这样,您将获得以下编译器警告:
warning: ordered comparison of pointer with integer zero [-Wextra]
Run Code Online (Sandbox Code Playgroud)