使用realpath函数进行转换问题(c编程)

时间:2009-10-18 03:06:20

标签: c linux gcc warnings realpath

编译以下代码时:

#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

2 个答案:

答案 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其头文件。