2016-07-14 14 views
-3

私はカスタム構造とさまざまな型(ints/strings /その他のカスタム構造...)の可変量の引数をとるC関数を持っています。構造のために、関数は、各引数がどの型であるかを、それを処理するために決定することができる。関数への可変パラメータの受け渡し

void doStuff(MyStruct *S,...){ <function code> } 

"doStuff"に定数のn個の引数を渡すことができる別の関数が必要です。私。このような何か:

void useDoStuff(Mystruct *S, int n){ //lets say n=4 
    va_list arguments; 
    int i; 
    for(i = 0 ; i < n ; i++){ 
     if(i%2) arguments.add(6); //example condition for the arguments 
     else arguments.add("Hello"); 
    } 
    doStuff(S, arguments); // doStuff(S, "Hello", 6, "Hello", 6); 
} 

当然のことながら、この文句を言わない仕事、va_listのは、このように使用することはできませんので、は(大まかにしか必要とされているものを「見える化」にそれを使用しました)。残念ながら、構造体やdoStuff関数は変更できませんので、回避策を見つける必要があります。そのような回避策は存在しますか?

+6

これはCではなく、C++です(Cには明示的な参照がありません)。これはXYの問題です。なぜ異質な引数リストを作成しようとしていますか? 'doStuff'の_actual_定義は何ですか? – Tim

+0

はい、C言語での参照がないというのは正しいですか(例ではポインタの代わりになぜそれらを使用したのかわかりません)。どのようにしても、doStuffが何をしているかは実際問題ではありません。特定の条件を満たす不定数の定数を渡す必要があります。 –

+0

引用: "当然va_listはこのように使うことはできません(必要なものを大まかに '視覚化するためにのみ使用する'ため)。つまり、va_listに「追加」機能がありますか? - いいえ。 –

答えて

2

Cでは、可変引数リストを動的に構築するメカニズムは定義されていません。通常、コンパイラは、コールの両側の引数リストを処理する実装固有のメカニズムを使用して、varargs呼び出しを通常の関数呼び出しに変換します。そのためには、コンパイラは各呼び出しの実際の引数が何であるかを知る必要があります。

最終的にvarargs関数を実行する必要がある場合は、複数の代替関数呼び出しを記述し、どちらを実行するかを動的に選択するか、いくつかの関数呼び出しを介して作業を実行することができます。それらを組み合わせることは可能かもしれません。

ただし、varargs関数の動作の適切な部分が、直接行使できるように、考慮することができるかどうかを検討してください。次に、可変引数の代わりに構造体の配列の形で使用するデータを受け入れる1つ以上の代替フロントエンドを提供することができます。

関連する問題