2

当我编译以下代码时:

#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

4

2 回答 2

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/ 以确切了解该宏打开了多少以及它发生了什么变化。

于 2009-10-18T03:43:11.843 回答
2

编译器不知道是什么realpath,所以它假定它是一个返回 int 的函数。它这样做是出于历史原因:许多较旧的 C 程序都依赖它来执行此操作。

您可能错过了它的声明,例如忘记了#include它的头文件。

于 2009-10-18T03:15:51.190 回答