プロが教える店舗&オフィスのセキュリティ対策術

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()
{
 //-- 変数の宣言 --------------------
 intiCnt;// ループカウンタ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;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

A 回答 (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);

です。
    • good
    • 0

とりあえず実現方法だけ書きます。

質問があれば、補足欄にでも書いてください。

#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))
    • good
    • 0

C99 なら「可変長引数マクロ」を作れます.


#define DEBUGLV1(format, ...) printf("LV[%d]" format, 1, ##arg)
のような感じかな? 使う方は
DEBUGLV1("LV1LOG: iCnt[%d]\n", iCnt);
のように使える... と思う. この場合, 第1引数は文字列リテラルのみだけど.
    • good
    • 0

DEBUGLVnの定義ではマクロの引数はstrのみですよね



実際使用している部分では 引数が2個あります
"LV2LOG:iCnt[%d]\n" と iCntです
誰も この%dに対してiCntの値を代入したりしません

やるなら
sprintf(buf, "iCnt[%d]\n", iCnt );
DEBUGLV1( buf );
といった具合でしょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/12/02 17:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!