2

由于在 CI 中可以按名称调用结构的成员 (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++ 中有什么方法可以通过他们的名字来初始化结构的成员?

4

3 回答 3

8

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

您描述的功能称为指定初始化程序,是在 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。

于 2013-06-03T14:15:28.380 回答
7

如果使用C++,则使用构造函数。Init byNULL确实是更多的 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)初始化字段,你不想用一些默认值初始化。

于 2013-06-03T12:23:14.200 回答
0

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

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

这是一个点堆栈溢出问题 C++20 中的指定初始值设定项

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

于 2021-11-19T18:27:46.300 回答