コード
#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)
使い方
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__
つかっておきながら、他に無いか調べるの失念してました。。完全に…
コード
#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