0

ライブラリに定義された関数と構造体があります。関数が構造体へのポインターを返すようにします。プログラムとライブラリをコンパイルしようとすると、次のエラーが発生します。

error: incomplete definition of type 'struct _bmpfile'
    printf("file size: %d", bmp->header.filesz);
                            ~~~^
/usr/local/include/bmpfile.h:116:16: note: forward declaration of 'struct _bmpfile'

typedef struct _bmpfile bmpfile_t;

構造体は bmpfile.h で宣言され、bmpfile.c で定義されます。私のプログラム main.c は、bmpfile_t を返す次の関数を呼び出します。

bmp = bmp_create_from_file(filename);

bmpfile_t*
bmp_create_from_file(const char *filename)
{
    FILE *fp;

    fp = fopen(filename, "r");
    if (fp == NULL) perror("error");

    bmpfile_t *bmp = (bmpfile_t *)malloc(sizeof(bmpfile_t));

    bmp_get_header_from_file(fp, bmp);
    bmp_get_dib_from_file(fp, bmp);
    bmp_get_pixels_from_file(fp, bmp);
    fclose(fp);
    return bmp;
}
4

2 に答える 2

1

そのprintf呼び出しでは、メンバーにアクセスする前に、構造体の完全な定義が必要です。

ライブラリでは、ヘッダー ファイルで構造体の名前のみを宣言するのが一般的です。そのため、ヘッダーを含むファイルは、内容を知らなくても型へのポインターを操作できます。構造体はopaqueと見なされます。これは、すべてのメンバーをプライベートに宣言するのとほぼ同等です。

ハッキングの目的で、構造体の定義をメイン ファイルに貼り付けて、構造体の値を覗くことができます。しかし、「プロダクション」コードの場合は、これをピリオド、文末にしないでください (本当に本当に正当な理由がある場合を除きますが、コードを見る可能性のある人にこの理由を説明する準備をしてください!)。

paulsm4 が言うように、bmp_header_t bmp_get_header(bmpfile_t *bmp);アクセスできるヘッダー オブジェクトを取得するために使用できます。

于 2013-06-29T03:45:13.230 に答える
1

問題は、bmpfile_t が「不透明な構造体」として宣言されていることです。

解決策:単に呼び出すbmp_get_header()

于 2013-06-29T03:55:30.220 に答える