構造体初期化子でドット(。)はどういう意味ですか?


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

私はこのC構文をよく理解していません。構文の名前がわからないので検索できません。あれは何でしょう?


構造体の初期化子のように見えます。
Mysticial

7
C99で標準化されているため、(本当に)古いコンパイラがある場合は機能しません。
一部のプログラマー、

2
最後に、このためのリンクを見つけstackoverflow.com/questions/330793/...
Mysticial

5
残念ながら、現在のバージョンのMSVCでさえ、この標準では「(本当に)古いコンパイラ」です。
ジョナサンレフラー、

まったく奇妙なことに、私はこの質問を検索している間に、ヒューズのチュートリアルも実行し、まったく同じイニシャライザを作成しました。
キーガンジェイ

回答:


141

これは、イニシャライザで構造体の特定のフィールドを名前で設定できるC99の機能です。その前に、イニシャライザはすべてのフィールドの値だけを順番に含む必要がありました-もちろん、それでも動作します。

したがって、次の構造体の場合:

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...使用できます

struct demo_s demo = { 1, 2, 3 };

...または:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...あるいは:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

...最後の2つはC99専用ですが。


ドット初期化はC ++でも機能しますか?(テストする必要があります)
ガブリエルステープルズ

1
それはそうであるように見えますが、C ++ 20の場合のみ、ドキュメントを見るだけです。Cのcppreference.comドキュメント(C99以降で機能):en.cppreference.com/w/c/language/struct_initialization、およびC ++(C ++ 20でのみ機能):en.cppreference.com/w/cpp / language / aggregate_initialization
ガブリエルステープルズ

gccを使用してC ++でこの「ドット初期化」タイプのフォームを試したところ、gcc C ++のすべてのバージョンでサポートされているように見えるので、gcc拡張機能としてgccでサポートされていることに注意してください。必ずしもgcc / g ++以外のコンパイラに移植可能ではないのではないかと疑っています。とはいえ、私はgcc / g ++コンパイラーを使用しているため、C ++のgccでサポートされている場合は、それを使用することもできます。
ガブリエルステープルズ

(少なくとも一部のコンパイラでは)ドットの初期化に問題がある可能性があります。 struct demo_s demo = { .first = 1, .first = 9 };私のGCCの一つでは、これは警告なしにコンパイルされ、最初の9になります
レナーテ


15

として知られていますdesignated initialisationDesignated Initializersを参照)。"initializer-list"、各 ' .'は " designator"であり、この場合、 ' fuse_oprations'構造体の特定のメンバーを指定して、 ' hello_oper'識別子で指定されたオブジェクトに対して初期化します。


0

構文全体は、COD3BOYですでに言及されているように、指定イニシャライザと呼ばれ、宣言時に特定の値またはデフォルト値に構造を初​​期化する必要がある場合に一般的に使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.