我正在使用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
答案 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中可用。您必须明确启用它(请参阅其他答案)。