5

通常、structc で a を初期化するには、フィールドの一部しか指定できませんでした。以下のように:

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

ただし、C++ では、structフィールドに名前を付けずに変数を初期化する必要があります。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: これを行う必要がある理由は、構造体 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++ 構造体のメモリ レイアウトが同じであるかどうかに依存します。保証されているかどうかはわかりません)。

* アップデート *

このアプローチは実際には問題なく機能しましたが、その後、ユーティリティ クラスを使用するようにコードを変換しました。つまり、fuse_operation 構造体への参照を取得して初期化する単一の静的「initialize」メソッドを持つクラスです。これにより、メモリレイアウトに関する不確実性が回避され、一般的に推奨されるアプローチになります。

于 2013-01-08T00:02:54.587 に答える
3

残念ながら、C++ 標準の C++11 バージョンでさえ、C99の指定された初期化子機能がありません。

于 2012-08-25T13:11:32.403 に答える
0

関数ポインターを入力として取り、残りの属性を NULL として割り当てる変数 param 関数を作成できるかもしれません。構造体が 1 つしかないため (fuse_operations)、関数を実装できる構造体は 1 つだけです。関数ポインタを実装に渡す init_struct(int no_op, ...) のようなもの。複雑すぎて面倒ですが、一度書いたらいつでも使えると思います...

于 2012-09-25T04:48:06.310 に答える