c - 为什么 struct BMPFILE_ 类型不完整?在C中

标签 c struct incomplete-type

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/

相关文章:

c - 代码块(GCC编译器)上的段错误,但是在Linux(GNU GCC)中可以

c - 按字母顺序插入链表

c - C中的函数返回结构

c - 使用递归函数添加数字

c - 是否存在其定义调用另一个系统调用函数的系统调用函数?

c - 我假设不能转发声明库的不透明指针类型是否正确?

c# - 为什么 System.DateTime 结构具有布局类型 Auto?

c++ - std::unique_ptr 的自定义删除器是手动调用析构函数的有效位置吗?

C:允许将任何数组分配给指向不完整类型数组的指针

c++ - 在 C++ 中创建自定义可比树状数据结构