如何在使用 g++ 编译器时使用 c 风格初始化结构体?

问题描述 投票:0回答:4

一般来说,为了在c中初始化一个

struct
,我们只能指定部分字段。如下:

static struct fuse_operations hello_oper = {
    .getattr    = hello_getattr,
    .readdir    = hello_readdir,
    .open       = hello_open,
    .read       = hello_read,
};

但是,在C++中,我们应该在不命名字段的情况下初始化

struct
中的变量。 现在,如果我想在使用 g++ 编译器时使用 c 风格初始化
struct
,该怎么办? PS:我需要这样做的原因是
struct fuse_operations
中有太多字段。

c++ c struct fuse designated-initializer
4个回答
5
投票

你写道:

   static struct fuse_operations hello_oper = {
       .getattr    = hello_getattr,
       .readdir    = hello_readdir,
       .open       = hello_open,
       .read       = hello_read,
   };

一般来说,为了在c中初始化一个结构体,我们只能指定部分字段[...]但是,在C++中, 我们应该初始化结构中的变量而不命名字段。现在,如果我想初始化怎么办 使用 c 风格的结构体,同时使用 g++ 编译器,如何实现这一点? PS:我需要这样做的原因 是结构体fuse_operations中有太多字段。

我的解决方案是使用构造函数来专门化结构:

struct hello_fuse_operations:fuse_operations
{
    hello_fuse_operations ()
    {
        getattr    = hello_getattr;
        readdir    = hello_readdir;
        open       = hello_open;
        read       = hello_read;
    }
}

然后声明新结构的静态实例:

static struct hello_fuse_operations hello_oper;

测试对我来说没问题(但这取决于 C 结构和 C++ 结构的内存布局是否相同——不确定是否能保证)

* 更新*

虽然这种方法在实践中效果很好,但我随后将我的代码转换为使用实用程序类,即具有单个静态“初始化”方法的类,该方法获取对 fusion_operation 结构的引用并对其进行初始化。这避免了有关内存布局的任何可能的不确定性,并且通常是我推荐的方法。


3
投票

不幸的是,即使是 C++ 标准的 C++11 版本也缺乏 C99 的指定初始化器功能


0
投票

也许你可以编写一个变量参数函数,它将函数指针作为输入,并将其余属性分配为 NULL。由于您只有一个结构体——fuse_operations,因此您只能为一个结构体实现该函数。像 init_struct(int no_op, ...) 这样的东西,您将函数指针传递给实现。它太复杂和费力了,但我想你可以写一次并永远使用它......


0
投票

使用 C++20,使用 C 风格的指定初始值设定项已成为可能。

示例:

struct S { int x; float y; }; S my_s{ .x = 1, .y = 2.3 };
请在 

GodBolt 上查看此内容。

请注意,使用它们时需要记住一些细节,例如未指定字段的后备,需要按照字段在结构中出现的顺序指定字段等。请点击上面的链接了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.