【问题标题】:casting issue with realpath function (c programming)realpath 函数的转换问题(c 编程)
【发布时间】:2009-10-18 03:06:19
【问题描述】:

当我编译以下代码时:

#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

【问题讨论】:

    标签: c linux gcc warnings realpath


    【解决方案1】:

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

    【讨论】:

    • 其实你应该阅读man feature_test_macros。此外,realpathasprintf 等的联机帮助页都说明了必须为它们的声明提供哪些宏。
    • @ephemient:当涉及到改变标准 C 库的行为时,标题是文档。称我为偏执狂,但勘误发生在从发布到发布的文档更新中。有时事情不正确,有时更改不会渗入文档中..有时新更改的文档记录不正确。我知道学习 glibc 会让人头大,但值得一看头。您需要知道每个宏实际上 做了什么 ,最好通过 grep 和其他方式获得。
    【解决方案2】:

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

    您可能缺少它的声明,例如忘记#include它的头文件。

    【讨论】:

    • 是的,在顶部放一个标准库。
    • 不,包括 stdlib 不会让它消失
    • 我知道,现在我需要做的就是弄清楚它是什么 :) 是否有任何其他信息可以提供帮助?
    • 在 glibc 中,realpath() 是一个扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多