複合リテラルを利用した関数呼び出しです。これは以下に相当します:
WindowHandlers temp = {
.load = main_window_load,
.unload = main_window_unload
};
window_set_window_handlers(s_main_window, temp);
上記は、名前で初期化するフィールドを指定することもできます。
WindowHandlers temp = { main_window_load, main_window_unload };
window_set_window_handlers(s_main_window, temp);
C standardをより詳細にこれらに入る:WindowHandlers
を想定し
のみload
とunload
その順序で含まれ、上記と同じです。セクション6.5.2.5から
:
イニシャライザの中括弧で囲まれたリストが続く括弧タイプ 名で構成後置表現は 化合物リテラルあります。初期化子リストによって指定された値が の名前のないオブジェクトを提供します。
...
例1
int *p = (int []){2, 4};
は2つのintの配列の最初の要素を指すようにp
を初期化ファイルスコープ定義、値を有する第2及び第二、四。 この複合リテラルの式は、定数が である必要があります。名前のないオブジェクトには、静的な記憶期間があります。セクション6.7.8から
:
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designationopt initializer
initializer-list , designationopt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
.identifier
...
指示フォームを持っている場合
.identifier
現在のオブジェクト(以下に定義)は、構造体 またはユニオン型で、識別子は、その型の のメンバ名になります。
...
例10構造部材は、その順序に依存することなく、非ゼロ値に初期化することができる。
div_t answer = { .quot = 2, .rem = -1 };
のリンクを参照してください。 function – Alex
@Alex - いいえ、代わりに複合リテラルです。そして、これは関数呼び出しAFAIKです。機能はありませんが、代わりに1つが呼び出されます。 2番目の関数引数は複合リテラルです。 – AnArrayOfFunctions
'window_set_window_handlers'は2つのパラメータ' s_main_window'と構造体 'WindowHandlers'を持ち、構造体' WindowHandlers'はここで初期化されます – fedi