C99中的指定初始化器:如何处理C11中未初始化的空结构成员

Designated Initializers in C99: How to handle empty uninitialized struct members in C11?

本文关键字:初始化 C11 处理 成员 结构 何处理 C99      更新时间:2023-10-16

由于在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++中有任何方法可以通过名称初始化结构的成员吗?

如何处理未初始化的成员?

您描述的功能被称为指定初始化程序,并在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++,则使用构造函数。NULL的初始化实际上更像是C方式。

不,没有标准的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( Initialize字段,您不希望使用某些默认值对其进行初始化。

FYI,之前的所有答案都是正确的。C++中不支持指定的初始化程序。。。直到C++20。

C++20在该版本的C++标准中添加了聚合初始值设定项。语法与C99点表示法不同,因为我想标准委员会希望语法更符合Cplusplussesque。

这里有一个点堆栈溢出问题C++20 中的指定初始化程序

这里有一个受欢迎的参考网站。https://en.cppreference.com/w/cpp/language/aggregate_initialization