相关疑难解决方法(0)

什么是零元素阵列的需要?

在Linux内核代码中,我发现了以下无法理解的内容.

 struct bts_action {
         u16 type;
         u16 size;
         u8 data[0];
 } __attribute__ ((packed));
Run Code Online (Sandbox Code Playgroud)

代码在这里:http://lxr.free-electrons.com/source/include/linux/ti_wilink_st.h

零元素数据数组的需求和目的是什么?

c structure

117
推荐指数
4
解决办法
8289
查看次数

使用模板和基类实现灵活的数组成员

在C99中,您通常会看到以下模式:

struct Foo {
    int var1;
    int var2[];
};

Foo * f = malloc(sizeof(struct Foo) + sizeof(int)*n);
for (int i=0; i<n; ++i) {
    f->var2[i] = p;
}
Run Code Online (Sandbox Code Playgroud)

但不仅是这个糟糕的C++,它也是非法的.

您可以在C++中实现类似的效果,如下所示:

struct FooBase {
    void dostuff();

    int var1;
    int var2[1];
};

template<size_t N>
struct Foo : public FooBase {
    int var2[N-1];
};
Run Code Online (Sandbox Code Playgroud)

虽然这将工作(你可以访问FooBase的方法var2[2],var2[3]等等),它依赖于Foo作为标准配置,这是不是很漂亮.

这样做的好处是非模板化函数可以Foo*通过采用FooBase*和调用操作的方法来接收任何没有转换的函数var2,并且内存是连续的(这可能是有用的).

有没有更好的方法来实现这一点(这是合法的C++/C++ 11/C++ 14)?

我对两个简单的解决方案不感兴趣(包括基类中的额外指针到数组的开头,并在堆上分配数组).

c++ flexible-array-member

1
推荐指数
1
解决办法
2544
查看次数

bmiColors字段的BITMAPINFO结构

BITMAPINFO 结构有以下声明

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD bmiColors[1];
} BITMAPINFO;
Run Code Online (Sandbox Code Playgroud)

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

c++ windows arrays struct

1
推荐指数
1
解决办法
2942
查看次数

标签 统计

c++ ×2

arrays ×1

c ×1

flexible-array-member ×1

struct ×1

structure ×1

windows ×1