LoginSignup
11
11

More than 5 years have passed since last update.

cocos2d-xでクラス名とかつけてログだしたい。。。

Last updated at Posted at 2014-07-07

コード

Macro.h
#define CCLOG_D(arg, ...) \
    do { \
        const std::type_info& info = typeid(*arg); \
        cocos2d::log("%s::%s(): %s", info.name(), __FUNCTION__, cocos2d::StringUtils::format(__VA_ARGS__).c_str()); \
    } while (0)

使い方

HelloWorld.cpp

bool HelloWord::init()
{
    if (!Layer::init()) {
        return false;
    }

    CCLOG_D(this, "こんにちは〜");
    CCLOG_D(this, "進捗どうですか? : %s", "ダメです"); 
}

結果

cocos2d: 10HelloWorld::init(): こんにちは〜
cocos2d: 10HelloWorld::init(): 進捗どうですか? : ダメです

追記:PRETTY_FUNCTION

コメントにて @moriturus さんからご指摘頂きましたので追記。
__FUNCTION__つかっておきながら、他に無いか調べるの失念してました。。完全に…

コード

Macro.h

#define CCLOG_D(arg, ...) \
    cocos2d::log(\
        "%s [L:%d]:\n-- %s", \
        __PRETTY_FUNCTION__, \
        __LINE__, \
        cocos2d::StringUtils::format(arg, ##__VA_ARGS__).c_str()\
    )

結果

cocos2d: virtual bool HelloWorld::init() [L:41]:
-- 進捗どうですか? : ダメです

余談その2

大分良い感じ。
typeid版でつかってたクラス名取得のためのやつも必要ないし、
ちゃちゃっと調べると__LINE__というのも使えそうなので追加

ただこれ、クラス名+メソッド名だけじゃなくて、
戻り値やら引数なんぞも出力されるのですよね

たとえば


cocos2e::Sprite* createSprite(float x, 
                              float y, 
                              float w, 
                              float h,
                              std::function<void(const char* arg)> callback);

的な奴の中で使うと、結果は

cocos2d: cocos2d::Sprite *HelloWorld::createSprite(float, float, float, float, std::function) [L:54]:
-- create sprite

と出力される。
…長い(汗)
当初の目的は、ログ出力してるのは何処?っていうことなので、
にしては、ちょっといらない情報が。。(悪いわけではないけど
だから、出力フォーマットには改行を入れて、多少整形してみた

とはいえ、typeid版よりは個人的には好き&満足なので、
こっち採用です♪

@moriturus さん、感謝です

余談

ログ埋め込んでおいたのは良いものの、
いざってときに、あれ?こいつ誰が吐いてるんだっけ?
ってなることが多く
(だいたい後でまとめてテストするから忘れる(笑))

ってことで、誰が吐いてるかわかりやすくするために
個人的必要に迫られ、定義したもの

typeidで判別して出力するようにしてるんだけど…
他に方法ないですかね…
できたら、第一引数は無くしたいんだけど…

これだとandroidの開発みたいに

private static final String TAG = "クラス名";

private void hoge() {
    Log.d(TAG, "hoge");
}

と、
クラス名を直で文字列渡す感じで出力できるようにしちゃった方がいいかなぁ。。
とか思うし
でもこれはこれで、毎度毎度TAG宣言するのがアレだけど…
ファイル作成のテンプレートに盛り込んでしまえばいいのか…

なにかオススメの方法があれば、教えてくださいm(_ _)m

11
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11