CCLOGの様に、引数の個数をその時に応じて変えたくなる時があります。
その様な関数はどうやって作るのでしょうか?
与えられたint型の引数全てを乗算して返すメソッドmultiplyを作ってみましょう。
結論この様な形になります。
// HelloWorld.h
int multiply(int n,...);
// HelloWorld.cpp
int HelloWorld::multiply(int n,...)
{
int answer = 1;
int x = n;
va_list args;
va_start(args, n);
while(x != 0)
{
answer *= x;
x = va_arg(args, int);
}
va_end(args);
return answer;
}
// 使い方(必ず最後には最後を表す0を付けましょう)
CCLOG("%d", this->multiply(3,5,7,9,1,0));
さて、少しずつ見ていきましょう。
宣言部
int multiply(int n,...);
この「…」を付けると可変長引数を取る関数を宣言出来ます。簡単ですね。
さて、それではこのいっぱい受け取った引数(実装部分からは何個来ているか分かりません。)は、どうやって扱うのでしょうか?
実装部
va_list args;
まず、va_list型の変数argsを用意します。
va_start(args, n);
argsをnから始めますって感じですね。
while (x != 0)
{
x = va_arg(args, int);
}
そして、va_argで次の引数を読み取ります。
第二引数のintは受け取る変数の型です。
実は仮引数はポインタ上に並んでいます。
なので、この様に簡単にポインタを進めていき、次々に引数を読み取る事が出来ると言う訳です。
引数に変数の型を受け取るのはポインタを進めるためのデータ長を取得するためでしょうね。
va_end(args);
これでargsを使えなくしています。
誰かのお役に立てば。
コメント