open_memstream警告“没有强制转换的整数指针”

时间:2013-02-13 20:30:22

标签: c linux embedded

我正在使用open_memstream为嵌入式Linux系统编写一些C代码,我不明白为什么我会收到编译警告:赋值使得整数指针没有强制转换

为了简单起见,而不是粘贴我的所有代码,我使用here中的小例子重现了问题:

#include <stdio.h>
#include <stdlib.h>

int
main (void)
{
    FILE *stream;
    char *buf;
    size_t len;
    off_t eob;

    stream = open_memstream (&buf, &len);
    if (stream == NULL)
        /* handle error */ ;
    fprintf (stream, "hello my world");
    fflush (stream);
    printf ("buf=%s, len=%zu\n", buf, len);
    eob = ftello(stream);
    fseeko (stream, 0, SEEK_SET);
    fprintf (stream, "good-bye");
    fseeko (stream, eob, SEEK_SET);
    fclose (stream);
    printf ("buf=%s, len=%zu\n", buf, len);
    free (buf);
    return 0;
}

代码有效,但编译器抱怨行stream = open_memstream (&buf, &len);

它在说什么整数?我们正在传递一个指向函数原型所需的size_t的指针。

FILE *open_memstream(char **bufp, size_t *sizep);

这段代码有问题,还是需要查看我的编译器?我想以正确的方式摆脱这种警告。


更新:

使用gcc 4.3.2,glibc 2.9


更新2:

尝试以下方法:

powerpc-860-linux-gnu-gcc -std=c99 -Wall -D_XOPEN_SOURCE=700 -c source.c

结果:

source.c: In function 'main':
source.c:12: warning: implicit declaration of function 'open_memstream'
source.c:12: warning: assignment makes pointer from integer without a cast

根据this,似乎_XOPEN_SOURCE = 700可用,因为glibc 2.10

由于我使用glibc 2.9,我还有什么其他选择(除了升级glibc)?


更新3:

添加以下内容消除了警告:

extern FILE *open_memstream(char **bufp, size_t *sizep);

这个解决方案有什么问题吗?


更新4:

这取代了extern:

powerpc-860-linux-gnu-gcc -std=c99 -Wall -D_GNU_SOURCE -c ops_cmds.c

所以根据manpage,如果glibc在2.10之前(在我的情况下)和_GNU_SOURCE如果2.10 +

,则需要使用_XOPEN_SOURCE=700

2 个答案:

答案 0 :(得分:4)

定义:

#define _POSIX_C_SOURCE 200809L

#define _XOPEN_SOURCE 700
在包含stdio.h之前,在源代码中

。或者使用gcc,您可以使用-D选项定义宏值并将其传递给源文件:

gcc -std=c99 -Wall -D_XOPEN_SOURCE=700 -c source.c 

open_memstream是一个POSIX函数,如果没有这个定义,它的声明在你的程序中是不可见的。

答案 1 :(得分:1)

编译器抱怨open_memstream返回值,而不是你传递的参数。

未声明open_memstream,即编译器未看到原型。所以编译器(显然是C99之前的版本)假设它返回int。您正在强制int进入stream指针,这就是触发“使指针形成整数”的警告。

确保在尝试使用open_memstream之前声明stdio.h。原型应该驻留在{{1}}中,但它仅在POSIX.1-2008中可用。您必须明确启用它(请参阅其他答案)。