私は小さなC++アプリケーションを作成しており、この問題で困惑しています。要素の型が予期していない場合、va_argを使用してva_listマクロから要素にアクセスする際に、エラーを作成(および後でキャッチ)する方法はありますか?例えば: -
今count=va_arg(argp,int);
if (count <= 0 || count > 30)
{
reportParamError(); return;
}
私が代わりにint型のtypedefのを渡していた場合、私はMSのコンパイラにゴミ値を取得しますが、時間数の95%が(64ビットSLES10 sysの上)はgccに値0を取得します。いくつかの型チェックを強制する方法があるので、catchブロックで捕らえることができるエラーが出ますか?
これに関するアイデアは私にとって非常に役に立ちます。または、これを行うためのよりよい方法があります。関数のプロトタイプは次のとおりです。 -
void process(App_Context * pActx, ...)
機能がpActxが第一パラメータとして渡されるので、として第一パラメータを数える渡すことはできませんことが不可欠である
process(pAtctx,3,type1,type2,type3);
と呼ばれています。
更新-1
[OK]を、これは奇妙に聞こえるがNARGSは、SLES10のgccの上のva_listの一部にはいないようです。私はNARGSを以下のパラメータは、ゴミ値を得ることはありません、これを使用した後
#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif
に入れていました。しかし、これはコンパイラ/プラットフォームベースの#ifdefsを導入しています....ありがとうChrisとKristopher
なぜカウントを2番目のパラメータにしないのですか? 'void process(App_Context * pActx、std :: size_t nargs、...); ' –
@Chris、あなたの提案に感謝します。私はそのオプションを持っていましたが、gccでは、nargs後の1番目のパラメータ(type1)がガベージ値を取得しています。最後のパラメータもガベージ値を取得します。私は、nargsはva_list(argp、App_Context *)の後ろにva_list(argp、int)が続くva_listの一部であると仮定します。 – confused