C99中的指定初始化器:如何处理C11中未初始化的空结构成员
Designated Initializers in C99: How to handle empty uninitialized struct members in C11?
由于在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
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- C99中的指定初始化器:如何处理C11中未初始化的空结构成员