编译以下代码时:
#define _POSIX_C_SOURCE 200112L
#define _ISOC99_SOURCE
#define __EXTENSIONS__
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char *symlinkpath = argv[1];
char actualpath [PATH_MAX];
char *ptr;
ptr = realpath(symlinkpath, actualpath);
printf("%s\n", ptr);
}
我在包含对realpath函数的调用的行上收到警告,说:
warning: assignment makes pointer from integer without a cast
有人知道怎么了吗?我正在运行Ubuntu Linux 9.04
答案 0 :(得分:4)
这很简单。 Glibc将realpath()视为GNU扩展,而不是POSIX。所以,添加这一行:
#define _GNU_SOURCE
...在包含stdlib.h之前,它是原型并且已知返回char *
。否则,gcc将假设它返回默认类型int
。除非定义_GNU_SOURCE
,否则不会看到stdlib.h中的原型。
以下内容在没有警告的情况下符合要求 - -Wall传递:
#include <stdio.h>
#include <limits.h>
#define _GNU_SOURCE
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char *symlinkpath = argv[1];
char actualpath [PATH_MAX];
char *ptr;
ptr = realpath(symlinkpath, actualpath);
printf("%s\n", ptr);
return 0;
}
您会看到与其他常用扩展程序类似的行为,例如asprintf()。值得一看的是/ usr / include /以确切了解该宏的开启程度以及它的变化。
答案 1 :(得分:2)
编译器不知道realpath
是什么,所以它假设它是一个返回int的函数。它出于历史原因这样做:许多较旧的C程序都依赖它来做这件事。
你可能错过了它的声明,例如忘记#include
其头文件。