如何将指向库函数的结构的指针传递回main.c程序?

时间:2013-06-29 03:41:28

标签: c

我的库中定义了一个函数和一个struct。我希望函数返回一个指向结构的指针。当我尝试编译程序和库时,我收到以下错误:

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;
}

2 个答案:

答案 0 :(得分:1)

printf调用在访问成员之前需要完整定义结构。

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

出于黑客攻击的目的,您可以将结构定义粘贴到主文件中,并查看结构中的值。但对于“生产”代码,不要这样做,期间,句末(除非你有一个非常非常好的理由,但要准备好向可能看到代码的任何人解释这个理由!)。< /德尔>

正如paulsm4所说,你可以使用bmp_header_t bmp_get_header(bmpfile_t *bmp);来获取你可以访问的标题对象。

答案 1 :(得分:1)

问题是bmpfile_t被声明为“不透明的结构”。

解决方案:只需致电bmp_get_header()