1

を使用して組み込み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=7002.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より前)は、を返すと想定しますintintあなたはそれをポインタに強制していstreamます。これが「ポインタを整数にする」という警告をトリガーするものです。

open_memstream使用する前に、宣言されていることを確認してください。プロトタイプはに存在することになっていますがstdio.h、POSIX.1-2008でのみ使用可能です。明示的に有効にする必要があります(他の回答を参照)。

于 2013-02-13T20:41:56.243 に答える