2016-10-21 19 views
1

typedefを使わずに関数ポインタを返す関数を書こうとしています。返された関数はtypedefのない関数ポインタを返す

に割り当てられる必要があります
static int (*compare_function)(int a); 

これは最高の/唯一の方法ですか?

static static int (*compare_function)(int a) 
assign_compare_function(int a,...,char* z){ 
//blah 
} 

アサイナ機能を静的にしたいので、2つの統計情報があります。

+0

これは機能しますか?試してみてください。 –

+0

@EugeneSh。申し訳ありません:)私が言ったことは、これを正しい/慣用的な方法ですか? –

+2

なぜ 'typedef'を使わないのですか?それがインターフェイスの一部である場合、正しい方法はそれを使用することです。 –

答えて

3

定義の最初の問題点は、static staticと書いても意味がないことです。これは、staticのストレージ修飾子であり、タイプ自体の一部ではないためです。 2番目の問題は、両方の関数のパラメータリストが必要なことです。

あなたはこの記述することができます。これらのどちらかは、あなたが望むものであるタイプint (*)(int a)のオブジェクトを返します

static int (*compare_function(void))(int a) { 
    ... 
} 

int (*compare_function(void))(int a) { 
    ... 
} 

それともcompare_functionは、静的にすることができます。明確にするために、typedefを使用せずに、これは(someo

を数えないstatic staticを書くことは意味がない関数を返す関数を記述するための唯一の方法であるような何か書いて想像:。

ちょうどdoesnの
// no 
typedef static int SInt; 

」を

static int (*compare_function)(int a); 

タイプがint (*)(int)で、保存期間が静的であり、結合は内部で

:T変数を持っているときに、いずれかの任意の意味をなさない。ここで
+1

あなたは大丈夫ですが、戻り値の型が関数ポインタ型である関数のシグネチャを書く方法である質問のポイントを見逃したようです。 –

+0

@ JohnBollinger: "あなたは' int(* compare_function)(int a) '"と書くことができますか?私はあなたがなぜその質問に答えないと思うのか混乱しています。 –

+0

@DietrichEppが間違っていれば私を訂正してください。しかし、コードの最初の行は、おそらく関数ポインタを 'typedef'で返すような"最高 "か"慣用的な "方法でしょうか? –

1

正しく関数ポインタを返す方法です:

int compare_function(int a); 

int (*assign_compare_function())(int) 
{ 
    return compare_function; 
} 
0

キーワード静的スコープ修飾子です。これは型自体の一部ではありません。

int (*compare_function)(int a); 

intを返すintを返す関数を指定します。このステートメントの後にcompare_functionを使用すると、その関数シグネチャの型を参照できます。

あなたはそれを割り当てることができます:my_compare_functionは静的な修飾子を持っていることを

static int my_compare_function(int a) 
{ 
    return a - 10; // stupid implementation 
} 

compare_function = my_compare_function; 

お知らせ。

関連する問題