如何用c风格,同时使用G ++编译器来初始化一个结构?(How to initialize a st

2019-09-21 16:00发布

一般来说,为了初始化struct的C,我们只能指定域的一部分。 如下图所示:

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

然而,在C ++中,我们应初始化的变量struct不点名的字段。 现在,如果我想初始化一个什么struct用c ++风格,同时使用G ++编译器,如何做到这一点? PS:我需要这样做的原因是, struct fuse_operations中有太多的领域。

Answer 1:

不幸的是,即使是C ++标准的C ++ 11版本缺少指定的初始功能 C99的。



Answer 2:

你写了:

   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-struct和C ++的内存布局 - 结构是一样的 - 不知道有保证)

* UPDATE *

虽然这种方法在实践中工作得很好,我后来转换我的代码使用一个实用工具类,即,与采用对fuse_operation结构的引用,并初始化一个静态“初始化”方法的类。 这避免了关于内存布局的任何可能的不确定性,并会在一般我推荐的方法。



Answer 3:

也许你可以写一个变量PARAM函数作为输入函数指针和分配attribs为NULL的其余部分。 既然你只有一个结构 - fuse_operations,可以实现只为一个结构的功能。 像init_struct(INT NO_OP,...),其中传递函数指针来实现。 它过于复杂和艰苦的,但我想你可以写一次,并一直使用它...



文章来源: How to initialize a struct using the c style while using the g++ compiler?
标签: c++ c struct fuse