• ベストアンサー

マクロに関して

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; } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

質問者が選んだベストアンサー

  • ベストアンサー
  • z64423
  • ベストアンサー率53% (26/49)
回答No.3

いちばん手っ取り早いのはこうですね。 #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)
回答No.4

とりあえず実現方法だけ書きます。質問があれば、補足欄にでも書いてください。 #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)
回答No.2

C99 なら「可変長引数マクロ」を作れます. #define DEBUGLV1(format, ...) printf("LV[%d]" format, 1, ##arg) のような感じかな? 使う方は DEBUGLV1("LV1LOG: iCnt[%d]\n", iCnt); のように使える... と思う. この場合, 第1引数は文字列リテラルのみだけど.

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DEBUGLVnの定義ではマクロの引数はstrのみですよね 実際使用している部分では 引数が2個あります "LV2LOG:iCnt[%d]\n" と iCntです 誰も この%dに対してiCntの値を代入したりしません やるなら sprintf(buf, "iCnt[%d]\n", iCnt ); DEBUGLV1( buf ); といった具合でしょう

shin-emi
質問者

お礼

ご回答ありがとうございます。 なるほど。そういった方法なのですね。 ありがとうございます。 ちなみに、DEBUGLVnをprintfのように複数のパラメータ?に対応させるには、とりうる分のDEBUGLVnを記述するしか方法はないのでしょうか? printf()と同様の機能+ログレベルの出力はマクロのオーバライド?以外は方法がないのでしょうか? +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DEBUGLV1("LV1LOG:iCnt[%d][%c]\n", 50,'a'); 上記のように記述したら、↓のよう出力されるようにしたいです。 "LV[1]LV1LOG:iCnt[50][a]" +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

関連するQ&A

専門家に質問してみよう