因为在C中我可以通过名称调用结构的成员(myStruct.myMember =),我想知道在C ++中我将使用那些未初始化的成员做什么。 据我所知,C ++不支持这种初始化:
static struct usb_endpoint_descriptor fs_source_desc = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bmAttributes = USB_ENDPOINT_XFER_BULK,
.wMaxPacketSize = __constant_cpu_to_le16 (64),
};
但是当我使用正确的语法时,如何处理未初始化的成员?
假设我希望bDescriptorType
未初始化。我将它设置为NULL吗?
static struct usb_endpoint_descriptor fs_source_desc = {
USB_DT_ENDPOINT_SIZE,
NULL,
USB_ENDPOINT_XFER_BULK,
__constant_cpu_to_le16 (64)
};
或者C ++中是否有任何方法可以按名称初始化结构的成员?
答案 0 :(得分:7)
如果您使用C++
,请使用构造函数。 NULL
初始化更多是C-way。
不,没有标准的C ++方式来使用命名参数(像boost::parameters
这样的东西可能有帮助,但这里没有必要)。
您的情况可能类似
struct usb_endpoint_descriptor
{
usb_endpoint_desctiptor(type bL, type bAttr, type wSize) :
bLength(bL), bAttributes(bAttr), wMaxPacketSize(wSize) {}
type bLength;
type bDescriptorType;
type bmAttributes;
type wMaxPacketSize;
};
然而,在C ++中保留未初始化的变量是不好的方式。
因此,如果您使用C
结构,则可以
1)编写C ++包装器。
2)写出派生类。
3)初始化字段,您不希望使用某个默认值进行初始化。
答案 1 :(得分:7)
如何处理未初始化的成员?
您描述的功能称为指定的初始化程序,并在C99中引入。它不受C ++支持。未明确初始化的所有成员都保证设置为零(*)。
也许你没有考虑过,但同样适用于常规的struct初始化。例如:
typedef struct
{
int a;
int b;
} ab;
ab mystruct = { .a = 1 }; // a is 1, b is guaranteed to be 0
ab mystruct = { 1 }; // a is 1, b is guaranteed to be 0
(C ++也是如此。)
这个语言规则是我们可以通过输入以下内容将struct / array中的所有元素初始化为零的原因:
ab mystruct = { 0 };
因为它实际上意味着“将a
设置为零,然后将所有其他元素隐式初始化为零”。
(*)正式地,它们被初始化,好像它们有静态存储持续时间,即数据设置为零,指针设置为NULL等.C11 6.7.9 / 10.