繁体   English   中英

数组嵌套结构初始化

[英]Array nested struct initialization

还有其他关于初始化嵌套结构数组的帖子。 但是,遵循 Stackoverflow 中其他地方的给定建议和聚合初始化的链接并不能帮助我解决问题。

我的上下文是我正在初始化 Vulkan 图形 API 中的许多嵌套结构。

但是,在查看其他代码以进行解释时,我遇到了以下“C”初始化(请注意,我正在添加定义的结构和有问题的代码)

Vulkan 类型定义

typedef union VkClearColorValue {
    float       float32[4];
    int32_t     int32[4];
    uint32_t    uint32[4];
} VkClearColorValue;

typedef struct VkClearDepthStencilValue {
    float       depth;
    uint32_t    stencil;
} VkClearDepthStencilValue;

typedef union VkClearValue {
    VkClearColorValue           color;
    VkClearDepthStencilValue    depthStencil;
} VkClearValue;

有问题的“C”代码

    const VkClearValue clear_values[2] = {
            [0] = {.color.float32 = {0.2f, 0.2f, 0.2f, 0.2f}},
            [1] = {.depthStencil = {demo->depthStencil, 0}},
    };

'C' 表示在 C99 和最新的 gcc 编译器中是合法的。

但是,当我将其应用于 C++ 时,我得到了错误。

回到聚合初始化的规则,“C”表示在 C++17 中应该是合法的。 但是,在编译时,我得到了错误: error: expected primary-expression before '.' 令牌

显然我的假设是错误的。 因此,是否有人提供有关如何使其在 C++17 中合法化的指导。

回到聚合初始化的规则,“C”表示在 C++17 中应该是合法的

你错误地假设,因为你已经正确地得出结论。 C++ 自第一个标准版本以来已经进行了聚合初始化,但它不支持在 C99 中添加的所有初始化。 例如,指定的初始化程序根本不在 C++17 中。

因此,普通联合只能在第一个活跃成员的情况下初始化,就像在 C89 中一样。 要激活另一个成员,必须在初始化后分配。 要使用 const object 执行此操作,您可以使用 function。


C++20 添加了指定的初始化程序,但即便如此,也只允许 C 的子集。 以下在 C++20 中格式正确:

const VkClearValue clear_values[2] = {
    {.color {.float32 = {0.2f, 0.2f, 0.2f, 0.2f}}},
    {.depthStencil = {42, 0}},
};

这不是 c++ 中的有效聚合初始化形式,即使它在 c 中也是如此。 其实有一个说明:

注意:乱序指定初始化、嵌套指定初始化、指定初始化和正则初始化混合、arrays的指定初始化在C编程语言中都支持,但在ZF6F87C9FDCF18B3C2C9Z877F中不允许。

 struct A { int x, y; }; struct B { struct A a; }; struct A a = {.y = 1, .x = 2}; // valid C, invalid C++ (out of order) int arr[3] = {[1] = 5}; // valid C, invalid C++ (array) struct B b = {.ax = 0}; // valid C, invalid C++ (nested) struct A a = {.x = 1, 2}; // valid C, invalid C++ (mixed)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM