5

通常,为了struct在 c 中初始化 a,我们只能指定部分字段。如下所示:

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

struct但是,在 C++ 中,我们应该在不命名字段的情况下初始化变量。现在,如果我想struct在使用 g++ 编译器的同时使用 c 样式初始化 a 怎么办,如何实现呢?PS:我需要这样做的原因是其中的struct fuse_operations字段太多。

4

3 回答 3

5

你写了:

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

通常,为了在 c 中初始化一个结构,我们只能指定部分字段 [...] 但是,在 C++ 中,我们应该在不命名字段的情况下初始化结构中的变量。现在,如果我想在使用 g++ 编译器的同时使用 c 样式初始化一个结构,该怎么做呢?PS:我需要这样做的原因是 struct 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++-struct 的内存布局是否相同——不确定是否有保证)

* 更新 *

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

于 2013-01-08T00:02:54.587 回答
3

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

于 2012-08-25T13:11:32.403 回答
0

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

于 2012-09-25T04:48:06.310 回答