c++ - C99 : How to handle empty uninitialized struct members in C11? 中的指定初始化器

标签 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++ 中有什么方法可以通过名称初始化结构的成员?

最佳答案

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/

相关文章:

c++ - 无法在 MacOS Mojave 上链接 C++11 的库

c++ - 如何构建 Qt Quick 2d 渲染器?

c++ - 基本类型的统一初始化?

c++ - 为什么 C++11 不像 C99 那样支持指定的初始值设定项列表?

java - 在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送

c - C编程为MIPS汇编(用于循环)

c - 我该如何修复这个 strtok() 调用

c - 为什么它显示两个数组而不是一个数组

c - 当我将标志 "-std=c99"添加到 minwg32 时会发生什么?

c - 枚举类型不可用