2010-12-19 12 views
4

次のコードは誰に教えてください。それは関数宣言かステートメントですか?それは有効なコードですか?コードの説明は何ですか?

static void (*const handle_screens[NO_OF_SCREENS]) (void) = 
    { status_screens, settings_screens, access_screens, configuration_screens, 
     history_screens }; 
+1

「それは有効なコードですか?」それを入力してコンパイルすることで答えられます。残りの部分については、関数ポインタの配列のように見えます。各関数ポインタは、パラメータを持たない関数を指し、ある種のものとしておそらく使われている不透明なデータ型( 'void *')または無し( 'void')スクリーンハンドラの –

+3

私は彼らがVoidを返すと信じています*それは void *(* const handle_screens [NO_OF_SCREENS])(void) – EnabrenTane

+0

そうですね、EnabrenTane。私はちょうど右と左のルールをダブルチェックしました。 –

答えて

9

それがその署名void foo(void)

これらの関数ポインタの定数配列が容易なものです。 Google C Complex Declarationはエキサイティングなものです。

+0

'void foo(void)'または 'void * foo(void)'ですか?私は最近、厄介な関数ポインタの構文を見失ってしまった。 –

+0

が許可されました。 voidを取ってvoidを返すfuntionsへのポインタの配列。私は思う。 – EnabrenTane

1

Cの宣言と定義をデコードする方法をカバーするcommon rule(私は自分の記憶をリフレッシュしました)があります。そのリンクの指示に従うと、宣言は次のようになります。のエントリがconstの静的配列の場合、voidを返す引数を持たない関数へのポインタがhandle_screensです。

この配列は5つの関数で初期化されているので、NO_OF_SCREENSは5であると個人的には思います。これは、関数定義がvoid foo(void)であるという意味でEnabrenTaneが正しいことを意味します。

6

他のすべてが失敗し、宣言が宣言されていることが100%わからない場合は、cdeclユーティリティを確認してください。これはLinuxのユーティリティですが、誰かがcdecl.orgにウェブインタフェースを作成しています。 NO_OF_SCREENSの#defineのために挿入するためにランダムな番号を選んで、あなたが得る:

> static void (*const handle_screens[1]) (void); 

declare handle_screens as static array 1 of const pointer to function (void) returning void 

Link to result.

+0

ニースサイト。私はCプログラミングに再び鞍を打つなら、それを使用します。 –

関連する問題