関数ポインタを使用して2つの異なるコードに遭遇しました。
どちらが良いか教えてください。好みはありますか?
typedef int myFunction(int a,int b);
extern myFunction *ptfunction;
と
typedef int (*ptfunction)(int a,int b);
関数ポインタを使用して2つの異なるコードに遭遇しました。
どちらが良いか教えてください。好みはありますか?
typedef int myFunction(int a,int b);
extern myFunction *ptfunction;
と
typedef int (*ptfunction)(int a,int b);
どちらも構文的に正しくないという点で悪いです。
必要なもの:
typedef int (*myFunction)(int a, int *b);
2 番目は無効です。型ではなく変数を宣言するように最初の行を修正すると、最初の行と同等になります。
int (*ptfunction)(int a, int b);
どちらが「より良い」かは、これらのもので何をしたいかによって完全に異なります。同じ型を何度も参照する必要がある場合は、typedef
を使用するとわかりやすくなります。例のように単一の関数ポインターを宣言するだけの場合は、余分なノイズが追加されるだけです。
(おそらく、最初の例では、2 番目のパラメーターはint
notint*
である必要があります。そうしないと、関数呼び出しがコンパイルされません)。
多くの場合、関数オブジェクトを使用する方が便利で柔軟です。std::function
特に、これらは任意の状態をバインドできるためです。しかし、それはこの質問の範囲を超えています。
どちらでもない、使うstd::function
std::function<int (int ,int)> ptfunction;
ptfunction = f1;
例 (c++0x の std にあります):
最初のものには別のエラーが含まれています: int を int へのポインターにキャストすることはできません。で、どっちがいいの?どちらも完全に文脈から外れています。
最初のコードでは、ptfunction をどこかに定義する必要があります。2番目のコードはコンパイルできないと思います。
これを試して:
typedef int *PTFUNCTION(int, int);
PTFUNCTION func = f1;
func(1, 2);