1

我正在使用 an 为嵌入式 linux 系统编写一些 C 代码,但open_memstream我不明白为什么会收到编译警告:assignment makes pointer from integer without a cast

为了简单起见,我没有粘贴我所有的代码,而是从这里用小例子重现了这个问题:

#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

据此似乎 _XOPEN_SOURCE=700自 glibc 2.10 起可用。

由于我使用的是 glibc 2.9,我还有哪些其他选择(除了升级 glibc)?


更新 3:

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

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

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


更新 4:

这有效,而不是外部:

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

所以根据手册_GNU_SOURCE,如果 glibc pre-2.10(在我的情况下)和_XOPEN_SOURCE=700如果 2.10+ ,需要使用

4

2 回答 2

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 函数,如果没有这个定义,它的声明在你的程序中是不可见的。

于 2013-02-13T20:31:19.270 回答
1

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

open_memstream没有声明,即编译器看不到原型。因此编译器(显然是 C99 之前的版本)假定它返回一个int. 您将其强制int转换为stream指针,这会触发有关“使指针形成整数”的警告。

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

于 2013-02-13T20:41:56.243 回答