2010-12-02 13 views
0

現在、私は、このように関数を呼び出す:関数をパラメータとして渡すことはできますが、関数は異なる引数を保持できますか?

parse2parameterはOptionValueStruct_tで定義されている2つのパラメータを有するFUNC()である
typedef struct OptionValueStruct{ 
    const char *option_name;  
    int (*func)(char*, char**);  
} OptionValueStruct_t; 


int parse2parameter(char *opt_name, char** opt_val); 
int parse3parameter(char *opt_name, char** opt_val, int a); 


const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter} 
}; 


それはどのように私は

const OptionValueStruct_t option_values[] = { 
{"Counter1", parse2parameter}, 
{"Counter2", parse3parameter} 
}; 

parse2parameter()とparse3parameterを使用することも可能である()のパラメータの異なる数/タイプを持っていますか?

+0

すべてをコードボックスに入れてください。あなたはそのコードをすべて選択し(最初に "' 'を取り除く)、リッチテキストエディタで101010ボタンをクリックすることでそれを行うことができます。または、コードと他のテキストの間にスペースを追加し、コードを4つのスペースでインデントすることもできます。 –

答えて

2

あなたは本当に何をしようとしていますか、なぜですか?

関数ポインタを受け取るコードについて考えてみましょう。それをどのように呼び出すのか、どうしたら分かりますか?

+0

異なるカウンターが異なる機能を必要とするためです。 Thx – user389955

+0

私はあなたが私に尋ねたものを理解するとは思わない。 "どのように" "理由"と答えられていません。 –

+0

呼び出す方法を知る方法の答えは私の答えです(関数の型を示す構造体に値を追加してください)。 –

0

va_start,va_arg,va_endを見る。あなたは2つと3つの議論によって制限されません。

+0

これは同じ名前で異なる数/タイプのパラメータを持つseverl関数がある場合に適用されるようです。私のファッションネームも違う。したがって、va_startを使用している場合は、parse2parameter()とparse3パラメータ – user389955

+0

@ user389955をラップする関数を作成する必要があります。これは 'printf'のような関数があるときに適用されます。これらの 'va_arg'、' va_start'、および 'va_end'を使用するので、渡す変数の数に制限はありません。最初のパラメータは、 'printf'が何回のfollowとその型を知るために解析し、それらを出力する文字列定数です。関数の最初の2つのパラメータは、同じ型を持つように見えます。したがって、文字列定数を3番目のパラメータとして追加して解析すると、1つの関数を使用してすべての作業を実行できます。これを使用しない理由がある場合は、コードを示すことが最も役立ちます。 – vpit3833

0

int(*)()を使用して、関数シグネチャを呼び出すことができるように関数シグネチャを記述する他のパラメータを使用できます。たとえば:

typedef struct OptionValueStruct{ 
    const char *option_name; 
    int (*func)(); /* actually takes some arguments */ 
    unsigned num_args; /* might need more fields to describe the args */ 
} OptionValueStruct_t; 

...

switch (value.num_args){ 
case 2: ((int (*)(char*, char**))value.func)(opt_name, opt_val); 
case 3: ((int (*)(char*, char**, int))value.func)(opt_name, opt_val, a); 
} 

もう一つの方法は、ちょうどparse3parameterに一致するようにポインタfuncを宣言するだろう、と、常にいくつかの上に(それは3つの引数を取ったかのようにそれを呼び出すと、プラットフォーム)、第3引数は単に無視されます。しかし、これはおそらくポータブルではありません。

+0

いいえ、関数ポインタを 'void *'に変換することはできません。なぜなら 'sizeof(関数ポインタ)<= sizeof(void *) 'であることが保証されていないからです。 –

+0

その非保証が壊れているプラ​​ットフォームを指定できますか?とにかく、すべてのことについて非常に正確にしたいのであれば、Cの1つの関数へのポインタが同じ大きさであるため、型をvoid-to-void-functionとして書くことができます。他の関数へのポインタ。私はそれを行うために私の答えを更新します。 –

+0

ありがとう、私はこの方法を試してみます。 – user389955

関連する問題