【cocos2d-x】可変長引数を取る関数について

c++

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を使えなくしています。

誰かのお役に立てば。

この記事のcocos記事一覧

コメント

タイトルとURLをコピーしました