微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这种类型的初始化称为什么?

如何解决这种类型的初始化称为什么?

我在 Vulkan 教程中看到代码

VkImageMemoryBarrier imageMemoryBarrier = {
 
   .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,.oldLayout = VK_IMAGE_LAYOUT_GENERAL,.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
            /* .image and .subresourceRange should identify image subresource accessed */ 
};

如果我只列出了没有成员 '.member_name =' 的枚举,那将是聚合初始化,对吗?但这叫什么?这个类在 .srcAccreasMask 之前还有其他成员,我假设所有其他没有提到的成员都是零初始化的?但是如果我不知道它叫什么,就很难查到它。另外,我记得像这样的东西是一个新的 C 特性,但它在 Visual Studio 中为我用 C++ 编译。这是一个 C++ 特性,对吧?

解决方法

这仍然是聚合初始化,从 C++20 开始支持 designated initializers 的语法。

T object = { .designator = arg1,.designator { arg2 } ... }; (3) (since C++20)
T object { .designator = arg1,.designator { arg2 } ... };   (4) (since C++20)

关于初始化程序中未提及的成员:

对于非联合聚合,未提供指定初始值设定项的元素的初始化与上述相同,当初始值设定项子句的数量小于成员数时(提供的默认成员初始值设定项,空列表-否则初始化):

顺便说一句:C++ 中的规则与 C 不同。

注意:乱序指定初始化、嵌套指定初始化、指定初始化器和常规初始化器混合、数组的指定初始化在C编程语言中都是支持的,但在C++中是不允许的。

,

另外,我记得像这样的东西是一个新的 C 特性

这并不新鲜。它是在 C99 中添加的。未显式初始化的成员归零。

https://port70.net/%7Ensz/c/c11/n1570.html#6.7.9

@songyuanyao 添加了一个很好的答案,但为了完整起见:它被称为指定初始值设定项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。