因为在 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++ 中有什么方法可以通过名称初始化结构的成员?
最佳答案
how do I handle members that are not initialized?
您描述的功能称为指定的初始值设定项,是在 C99 中引入的。 C++ 不支持它。所有未显式初始化的成员都保证设置为零 (*)。
也许您没有考虑过,但这同样适用于常规结构初始化。示例:
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++。)
这个语言规则是我们可以通过键入将结构/数组中的所有元素初始化为零的原因:
ab mystruct = { 0 };
因为它实际上意味着“将 a
设置为零,然后让所有其他元素隐式初始化为零”。
(*) 形式上,它们的初始化就像它们具有静态存储持续时间一样,即数据设置为零,指针设置为 NULL 等。C11 6.7.9/10。
关于c++ - C99 : How to handle empty uninitialized struct members in C11? 中的指定初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896587/