を使用して組み込みLinuxシステム用のCコードを書いていopen_memstream
ますが、コンパイルの警告が表示される理由がわかりません。代入により、キャストなしで整数からポインターが作成されます。
物事を簡単にするために、すべてのコードを貼り付けるのではなく、ここからの小さな例で問題を再現しました:
#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、glibc2.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
これによると、glibc2.10以降は_XOPEN_SOURCE=700が利用可能であるようです。
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
したがって、マンページによると、glibc_GNU_SOURCE
pre-2.10(私の場合)および_XOPEN_SOURCE=700
2.10+の場合に使用する必要があります。