2012-02-26 8 views
3

私はJavaからC++への上に移動したと私は前にマクロを使ったことがないと私はいくつかの方法は、このようなマクロメソッドには2つのリターンがありますか?

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) 

または

のようにも見知らぬ組み合わせのような2つの変数を返すように見えるか混乱しています
JNIEXPORT jdoubleArray JNICALL Java_algorithms_Shuffle0_getPriorities (JNIEnv *, jobject, jint, jint). 

何が起こっているか教えてもらえますか?申し訳ありませんが、これは極端な無知のように思えますが、前にマクロを使用したことはありません。また、プリプロセッサのC++の全章では、これらの取り決めを明確にしていません。

+0

マクロは実際には何も返されません。それらは単なるテキストの代用です。したがって、 '#define FOO 42'と' bar(FOO) 'は' bar(42) 'になります。 –

答えて

2

完全に理解するには、各マクロを展開する必要があります。プリプロセッサを使用してコードを実行して展開方法を確認するか、有益なIDEツールを使用して表示します。

あなたがそうするときは、次のように表示されます。

  • LRESULTは、結果の型です。何らかの記述の整数です。
  • CALLBACKは、__stdcallとなる呼び出し規約を定義しています。

そして、他のいずれかのよう:

  • JNIEXPORTはおそらくdeclspec(dllexport)に展開されます。これは、関数がライブラリからエクスポートされることを指定します。
  • jdoubleArrayが戻り値です。
  • JNICALLが呼び出し規約になります。

これらの余分なトークンは、関数のデコレータと考えることができます。彼らは、概念レベルで関数の署名を変更しません。おそらく、Javaに最も近い類似概念は属性です。

+0

ありがとう、それは私が逃した呼び出し規約です。今は理にかなっている。 – Ghost

関連する問題