6

私はCでのプログラミングで中間的な経験を持っていると思いますが、前にこの構文を使って関数を作成したことはありませんでした。これは、JQueryイベントのシンタックスを思い出させます。全体的に、私はこれが何であるか、そして代替構文が何であるかについての詳細な説明をしたいと思います。私が特にこれについてもっと読むことができる場所へのリンクも素晴らしいでしょう。このC関数の構文は何ですか?

// Set handlers to manage the elements inside the Window 
window_set_window_handlers(s_main_window, (WindowHandlers) { 
    .load = main_window_load, 
    .unload = main_window_unload 
    }); 

これはPebble WatchApp tutorialのコードスニペットです。

+0

のリンクを参照してください。 function – Alex

+3

@Alex - いいえ、代わりに複合リテラルです。そして、これは関数呼び出しAFAIKです。機能はありませんが、代わりに1つが呼び出されます。 2番目の関数引数は複合リテラルです。 – AnArrayOfFunctions

+2

'window_set_window_handlers'は2つのパラメータ' s_main_window'と構造体 'WindowHandlers'を持ち、構造体' WindowHandlers'はここで初期化されます – fedi

答えて

10

複合リテラルを利用した関数呼び出しです。これは以下に相当します:

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を想定し

のみloadunloadその順序で含まれ、上記と同じです。セクション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 }; 
+0

変数で先行する期間の意味を説明できますか? – user1717828

+0

@ user1717828初期化される構造体のどのフィールドを設定するかを指定します。 – dbush

5

これは以降C99から標準です。

(WindowHandlers) {} 

と指定された初期化子::これは、複合リテラルを結合さ

.load = main_window_load, 
.unload = main_window_unload 

私はそれは、構造体を作るWindowHandlers` `にキャストし、その中にそれを渡していると思う What does this dot syntax mean in the Pebble watch development tutorial?

+1

まあ、それは標準的なCです** ** C99と**導入されましたが(それでも有効です)。 – Olaf

関連する問題