在bmpfile.h中我定义结构:
struct BMP_FILE_ {
BMPHEADER header;
BITMAPINFOHEADER dib;
unsigned char channels;
rgb_px_t **pixels;
rgb_px_t *pal;
} BMPFILE_, *pBMPFILE;
typedef struct BMPFILE_ BMPFILE;
BMPFILE * bmp_create(uint32_t width, uint32_t height, uint32_t depth, uint32_t fillcolor);
bmpfile.c定义函数bmp_create_standard_color_table
static void
bmp_create_standard_color_table(BMPFILE *bmpfile)
{
switch (bmpfile->dib.depth) ...
}
错误:使用开关取消引用指向不完整类型的指针...
首先,为什么BMPFILE_类型不完整?
我不清楚为什么 BMPFILE_ 类型需要另一个名称。
typedef struct BMPFILE_ BMPFILE;
本来我想跳过它并仅使用 BMPFILE_ 作为函数 bmp_create 的返回类型,但出现了 BMPFILE_ 未知的错误。 我相信这意味着类型不完整,但我添加了
typedef struct BMPFILE_ BMPFILE;
结果是它可以通过编译器传递 header ,但 .c 文件中存在另一个错误。但我不知道为什么会发生这种情况。
在主函数中我尝试使用这个:
BMPFILE bmpfile;
而不是 BMPFILE * bmpfile;
它再次告诉我我不能这样做,因为类型不完整。但我绝对找不到它不完整的原因。因为我将它与声明为 PNG_DATA data;
(libpng) 的另一个非常相似的类型进行了比较。数据类型没有问题,即使两者具有相似的结构。我什至尝试从 BMPFILE_ (BMPFILE) 中删除子结构来测试它是完整类型还是不完整类型,但它仍然不完整。
最佳答案
您会因使用太多相似的名称而感到困惑(例如 BMPFILE_
与 BMP_FILE_
....),这会使您的代码不可读。而且您犯了一个拼写错误,这使编译器感到困惑。
转发声明
struct BMP_FILE_st;
然后
typedef struct BMP_FILE_st BMP_FILE;
然后定义你的结构:
struct BMP_FILE_st {
BMPHEADER header;
BITMAPINFOHEADER dib;
unsigned char channels;
rgb_px_t **pixels;
rgb_px_t *pal;
};
并且不要为指针创建typedef;所以编码 BMP_FILE*
,例如声明一个指针变量
BMP_FILE* ptr_bmp_file;
和一个聚合变量:
BMP_FILE my_bmp_file_struct;
关于c - 为什么 struct BMPFILE_ 类型不完整?在C中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540782/