C99中的指定初始值设定项:如何在C11中处理空的未初始化的struct成员?

时间:2013-06-03 12:20:28

标签: c++ c c99

因为在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 ++中是否有任何方法可以按名称初始化结构的成员?

2 个答案:

答案 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.