デバッグをする際に組み込み変数を簡単に表示したい事があると思うのだが、わざわざ毎回
int hoge = 5; printf("hoge:%d\n", hoge);
みたいなのを書いてたのだけど、"hoge:%d\n"
は予測補完効かないし、毎回書くのは地味に面倒だなあと思っていたのでその辺を簡単に書ける関数マクロを用意してみた。
説明するのも面倒なので取り敢えず以下にコードを示す。
printInstant.h
#pragma once #include<string> //debug用マクロこっちをつかう。 //渡した変数が簡易に表示される #define printInstant(print_var) PrintInstant(#print_var,print_var) //debug用マクロこっちをつかう。 //渡した変数が簡易に表示される。 //デバッグ用に情報(std::string)を1つ埋め込める #define printInstantInfo(print_var,info) PrintInstant(#print_var,print_var,info) int PrintInstant(std::string var_name, int var); int PrintInstant(std::string var_name, double var); int PrintInstant(std::string var_name, std::string var); int PrintInstant(std::string var_name, int var, std::string info); int PrintInstant(std::string var_name, double var, std::string info); int PrintInstant(std::string var_name, std::string var, std::string info);
printInstant.cpp
#include"printInstant.h" #include<stdio.h> int PrintInstant(std::string var_name, int var) { return printf((var_name + " : %d\n").c_str(), var); } int PrintInstant(std::string var_name, double var) { return printf((var_name + " : %lf\n").c_str(), var); } int PrintInstant(std::string var_name, std::string var) { return printf((var_name + " : %s\n").c_str(), var.c_str()); } int PrintInstant(std::string var_name, int var, std::string info) { return printf(("(" + info + ") " + var_name + " : %d\n").c_str(), var); } int PrintInstant(std::string var_name, double var, std::string info) { return printf(("(" + info + ") " + var_name + " : %lf\n").c_str(), var); } int PrintInstant(std::string var_name, std::string var, std::string info) { return printf(("(" + info + ") " + var_name + " : %s\n").c_str(), var.c_str()); }
使用方法としては
#include"printInstant.h" int main() { int hoge = 5; printInstant(hoge); return 0; }
出力
hoge : 5
みたいな感じでprintInstant(変数);
と書いてやる。
printInstantInfo
は付加情報を付けたい際に使う。
#include"printInstant.h" int main() { int hoge = 5; printInstantInfo(hoge,"test now"); return 0; }
出力
(test now) hoge : 5
まとめ
C言語のマクロをちゃんと知っている人ならすぐに思いつくのだろうが、僕はあまりそのあたりに詳しくなかったので最近思いついて書いてみた。
今回はprintf
をprintfDx
に書き換えればDXライブラリにも移植がし易いという理由でprintf
で描画したが、勿論std::cout
等でもいいと思う
わかりやすさのためにグローバルとして宣言したが、本当はもう少し隠蔽について考えたほうが良いのではないかと思う。