- ベストアンサー
マクロに関して
C言語・C++初心者です。 マクロにて、printfをレベル分けして出力したいと思っております。 下記のようにレベルを1,2に区分して、マクロを呼出して、printf上にそのレベルを出力させたいという意向です。頭ではこうしたいというものはまとまっておりますが、いざソースに起こすと、コンパイルエラーとなります。 そもそもの記述方法が検討違いなのかと思いますが、なかなかうまくいきません。 大変申し訳ございませんが、ご教授よろしくお願いいたします。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include <stdio.h> // デバッグレベル1 #define DEBUGLV1(str) printf("LV[%d]:%s",1,str) // デバッグレベル2 #define DEBUGLV2(str) printf("LV[%d]:%s",2,str) int main() { //-- 変数の宣言 -------------------- int iCnt; // ループカウンタt //-- 変数の初期化 ------------------ iCnt = 0; // ループ for(iCnt=0; iCnt<2; iCnt++) { if(iCnt == 0) { DEBUGLV1("LV1LOG:iCnt[%d]\n", iCnt); } else { DEBUGLV2("LV2LOG:iCnt[%d]\n", iCnt); } } return 0; } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
いちばん手っ取り早いのはこうですね。 #define DEBUGLV1 printf #define DEBUGLV2 printf か、 #define DEBUGLV1 printf("LV[1]LV1LOG:"), printf #define DEBUGLV2 printf("LV[2]LV2LOG:"), printf 使うほうは DEBUGLV1("iCnt[%d]\n", iCnt); DEBUGLV2("iCnt[%d]\n", iCnt); です。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
とりあえず実現方法だけ書きます。質問があれば、補足欄にでも書いてください。 #include <stdio.h> #include <stdarg.h> void debug_out(const char *format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); } void (*debug_level(int level))(const char*, ...) { printf("LV[%d]:", level); return &debug_out; } #define DEBUGLV1 (*debug_level(1))
- Tacosan
- ベストアンサー率23% (3656/15482)
C99 なら「可変長引数マクロ」を作れます. #define DEBUGLV1(format, ...) printf("LV[%d]" format, 1, ##arg) のような感じかな? 使う方は DEBUGLV1("LV1LOG: iCnt[%d]\n", iCnt); のように使える... と思う. この場合, 第1引数は文字列リテラルのみだけど.
- redfox63
- ベストアンサー率71% (1325/1856)
DEBUGLVnの定義ではマクロの引数はstrのみですよね 実際使用している部分では 引数が2個あります "LV2LOG:iCnt[%d]\n" と iCntです 誰も この%dに対してiCntの値を代入したりしません やるなら sprintf(buf, "iCnt[%d]\n", iCnt ); DEBUGLV1( buf ); といった具合でしょう
お礼
ご回答ありがとうございます。 なるほど。そういった方法なのですね。 ありがとうございます。 ちなみに、DEBUGLVnをprintfのように複数のパラメータ?に対応させるには、とりうる分のDEBUGLVnを記述するしか方法はないのでしょうか? printf()と同様の機能+ログレベルの出力はマクロのオーバライド?以外は方法がないのでしょうか? +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DEBUGLV1("LV1LOG:iCnt[%d][%c]\n", 50,'a'); 上記のように記述したら、↓のよう出力されるようにしたいです。 "LV[1]LV1LOG:iCnt[50][a]" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++