学習の1 va_listの相関関数:
va_listの変数パラメータは、ポインタ型の定義です。
次のように使用されたva_list:
1)第1のva_list型の変数を定義する機能を有し、可変パラメータは、ポインタへのポインタです。
2)第1 va_list型の変数を定義する機能を有し、可変パラメータは、ポインタへのポインタです。
3)次に、変数パラメータを返すのva_arg、2番目のパラメータは、あなたが複数の可変パラメータは、ターンの呼び出しでパラメータを取得するのva_arg場合)(戻したいのva_argのtypeパラメータです。
4)最終的な最終用途を取得するためにマクロ変数パラメータはva_end。
使用時にはva_listの問題に注意を払う必要があります。
1)可変パラメータの種類及び数は、コードによって完全に制御され、それはインテリジェント異なるパラメータの数およびタイプを識別することができません。
2)私たちは、単に変数バッファにリストをコピー、11 Xiangjie各パラメータを必要としない場合は、使用することができますvsprintfの機能を。
3)関数のプロトタイプ変数パラメータを確認するために、コンパイラが不利なプログラミングのトラブルシューティングを、十分に厳格ではないので、高品質なコードを書くために私たちに助長されていません。
コーディング:
#include " STDARG.H " の#include <iostreamの> する#include <stdio.hの> 静的チャー BUF [ 512 ]。 int型の合計(のchar *のMSG、...); INTメイン(ボイド) { int型の合計= 0 ; 文字列str [] = " !%dhello%dworld%d個" ; 合計 = SUM(STR、1、2、3 )。 std :: coutの << " 合計= " << <<合計 :: ENDL STDと、 戻り 0 ; } int型 SUM(CHAR * MSG、...) { va_listのvaList; //は、可変パラメータを有するva_list型の変数を定義するポインタへのポインタです。 va_startマクロ(vaList、MSG); // アドレスリストの最初の可変パラメータポイントは、アドレスが自動的に増加し、第2のパラメータビットの固定値 STD :: MSG COUT << << STD :: ENDL; INT sumNum = 0 。 INTのSTEP、I; vsnprintf(BUF、はsizeof (BUF)、MSG、vaList); のため(I = 0 ;私は< 30 ; I ++は){ のprintf(" %のC " 、[I] BUF)。 } ながら(0!=(STEP =のva_arg(vaList、intは)))// 最初の引数のva_argする可変パラメータのアドレスであり、2番目のパラメータが渡されたパラメータの一種で、戻り値は、アドレスva_listのあります値、タイプ、および$ { // 次のポインタを得るのva_arg // 、パラメータはva_listのをとることができる0に等しくないある sumNum + = ステップ; } はva_endする(vaListを); // 終了可変引数リストを 返すsumNumを; }
参照: