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调用将需要结构的完整定义,然后才能访问成员。

库通常只在头文件中声明结构的名称,因此包括头文件的文件可以在不知道内容的情况下操纵指向类型的指针。该结构被认为是不透明的。这大致相当于将所有成员声明为私有的 C。

出于黑客目的,您可以将结构定义粘贴到主文件中并查看结构中的值。但是对于“生产”代码,永远不要这样做,句号,句尾(除非你有一个非常非常好的理由,但要准备好向任何可能看到代码的人解释这个原因!)。

正如 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 回答