C++ BITMAPINFO结构的颜色字段

C++ BITMAPINFO结构的颜色字段,c++,arrays,windows,struct,C++,Arrays,Windows,Struct,BITMAPINFO结构具有以下声明 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; 为什么RGBQUAD数组是静态的?为什么它不是指针?它是否是静态的并不重要。问题是,您仍然需要为调色板分配足够的内存。它是一个RGBguad,因为它只存储R、G、B、a,其他什么都不存储 例如: for(i = 0; i < 256; i++) {

BITMAPINFO
结构具有以下声明

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD bmiColors[1];
} BITMAPINFO;

为什么
RGBQUAD
数组是静态的?为什么它不是指针?

它是否是静态的并不重要。问题是,您仍然需要为调色板分配足够的内存。它是一个RGBguad,因为它只存储R、G、B、a,其他什么都不存储

例如:

for(i = 0; i < 256; i++)
{
    lpbmpinfo->bmiColors[i].rgbRed = some_r;
    lpbmpinfo->bmiColors[i].rgbGreen = some_g;
    lpbmpinfo->bmiColors[i].rgbBlue = some_b;
    lpbmpinfo->bmiColors[i].rgbReserved = 0;
}
(i=0;i<256;i++)的

{
lpbmpinfo->bmiColors[i].rgbreed=some\r;
lpbmpinfo->bmiColors[i].rgbGreen=some\u g;
lpbmpinfo->bmiColors[i].rgbBlue=some_b;
lpbmpinfo->bmiColors[i].rgbReserved=0;
}

声明可变大小的结构是一个标准技巧。颜色表从不只有一个条目,对于单色位图,它至少有2个条目,对于8bpp位图,通常是256个条目,等等,由bmiHeader.biclrued成员指示。因此,结构的实际大小取决于位图格式


因为C语言不允许声明这样的数据结构,所以这是最接近的匹配。创建结构需要malloc()分配足够的字节来存储根据BICLRUSE计算的结构。然后对(BITMAPINFO*)进行简单的强制转换,使其可用。

声明中没有
static
关键字。
它是一个完全正常的结构成员。它用于声明一个可变大小的结构,最后是一个可变大小的数组

数组的大小只有在编译时才知道,因此我们将使用
array[1]
。请参阅中陈雷蒙女士的详细解释

在某些编译器(如GCC)上,允许零长度数组作为扩展,因此Linux和许多其他平台通常使用
array[0]
而不是
array[1]

GNUC中允许声明长度为零的数组作为扩展。零长度数组可用作结构的最后一个元素,该结构实际上是可变长度对象的标头:

struct line {
  int length;
  char contents[0];
};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

在C99中,引入了一个名为的新特性。从那时起,为了便于移植,最好使用
array[]

struct vectord {
    size_t len;
    double arr[]; // the flexible array member must be last
};
另见


可能是因为直接从位图文件读取,而不是从内存读取。但这只是我的猜测,我理解。我想使用BITMAPINFO作为变量。现在我明白了,谢谢大家)