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;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);
です。
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))
No.2
- 回答日時:
C99 なら「可変長引数マクロ」を作れます.
#define DEBUGLV1(format, ...) printf("LV[%d]" format, 1, ##arg)
のような感じかな? 使う方は
DEBUGLV1("LV1LOG: iCnt[%d]\n", iCnt);
のように使える... と思う. この場合, 第1引数は文字列リテラルのみだけど.
No.1
- 回答日時:
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]"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
【C言語教えてください】sin波...
-
scanfに文字が入力されたときに...
-
ガウスの消去法、後退代入について
-
C言語プログラミング
-
defineで定数が置き換えられな...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
分数を表示するプログラム(長...
-
switch分のケースを範囲数?に...
-
カレンダーのプログラムについて
-
C言語初心者です。次の問題で質...
-
C言語です
-
じゃんけんゲームの応用
-
BMI値から体型を判定するプログ...
-
(C言語)めちゃくちゃな値にな...
-
なぜgccはstdio.hをインクルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報