デバッグ時にのみ printf として機能する仕組み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 20
登録日時: 10年前

デバッグ時にのみ printf として機能する仕組み

#1

投稿記事 by やまっち » 10年前

いつもお世話になっております。

bcc55 [C90 ?] + Windows で C 言語の勉強をしている者です。
デバッグ時にだけ printf で数値を表示し、
デバッグ時でない時には何もしないような機能を持った関数を使いたいです。

(1) #define debug_print 1 ? (void) 0 : printf
(2) #define debug_print 1 ? 0 : printf
(3) #define debug_print //

仮に debug_print と言う名前にします。
http://tricky-code.net/nicecode/code10.php
を見ると
  #define debug_print 1 ? (void) 0 : printf
とするような方法が記載されていましたが
  エラー E2468 test.c 28: void 型の値は許されない
と言うエラーのため
  #define debug_print 1 ? 0 : printf
として使う事を考えました。

しかし、この状態で
  int i=777;
  debug_print("%d \n",i);
と言う具合に使うと
  警告 W8004 test.c 27: 'i' に代入した値は使われていない(関数 main )
と言う警告が出ます。

次に
  #define debug_print //
としてみました。
これでも
  警告 W8019 test.c 25: コードは効果を持たない(関数 main )
と言う警告が出ます。

私の職場では警告 (ワーニング) の発生も禁止されており
できれば警告が出ないような方法がないか、教えて頂きたいです。

以上、よろしくお願いします。

コード:

#include <stdio.h>

#if 0 // デバッグ時はここを 1 に
#define debug_print printf
#else
// #define debug_print 1 ? (void) 0 : printf	/* エラー E2468 test.c 28: void 型の値は許されない(関数 main ) */
// #define debug_print 1 ? 0 : printf	/* 警告 W8004 test.c 27: 'i' に代入した値は使われていない(関数 main ) */
#define debug_print //	/* bcc55 では 警告 W8019 test.c 25: コードは効果を持たない(関数 main ) */
#endif

void main()
{
	int i=777;
	debug_print("%d \n",i);
}


あごみつ
記事: 17
登録日時: 10年前

Re: デバッグ時にのみ printf として機能する仕組み

#2

投稿記事 by あごみつ » 10年前

はじめまして

C90だと可変長引数マクロって使えないですよね

コード:

#include <stdio.h>
#include <stdarg.h>

int debug_printf(char const* fmt, ...)
{
	int result;

	va_list list;
	va_start(list, fmt);
	result = vprintf(fmt, list);
	va_end(list);

	return result;
}

int debug_printf_unused(char const *fmt, ...)
{
	(void)fmt;

	return 0;
}

#if 0
#	define debug_print debug_printf
#else
#	define debug_print debug_printf_unused
#endif

int main(void)
{
	int i = 3;
	debug_print("%d", i);

	return 0;
}

みたいなスマートじゃない方法しか思いつきませぬ……

あごみつ
記事: 17
登録日時: 10年前

Re: デバッグ時にのみ printf として機能する仕組み

#3

投稿記事 by あごみつ » 10年前

オフトピック
debug_printfはまったく要らなかったですね
そのままprintfに置き換えれば良いです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: デバッグ時にのみ printf として機能する仕組み

#4

投稿記事 by みけCAT » 10年前

gcc (GCC) 4.8.1は騙せませんでした(警告が出ました)が、Borland C++ 5.5.1は騙せたようです。

コード:

#include <stdio.h>

#if 0 /* デバッグ時はここを 1 に */
#define debug_print printf
#else
#define debug_print if(printf && !printf)printf
#endif

int main(void)
{
	int i=777;
	debug_print("%d \n",i);

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: デバッグ時にのみ printf として機能する仕組み

#5

投稿記事 by みけCAT » 10年前

わざわざ排中律の否定のド・モルガンを使わなくても、後半の偽の部分だけでいいですね。

コード:

#include <stdio.h>

#if 0 /* デバッグ時はここを 1 に */
#define debug_print printf
#else
#define debug_print if(!printf)printf
#endif

int main(void)
{
	int i=777;
	debug_print("%d \n",i);

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: デバッグ時にのみ printf として機能する仕組み

#6

投稿記事 by みけCAT » 10年前

errnoと排中律の否定のド・モルガンを用いると、gcc (GCC) 4.8.1およびWandbox上のclangでも警告が出ませんでした。

コード:

#include <stdio.h>
#include <errno.h>

#if 0 /* デバッグ時はここを 1 に */
#define debug_print printf
#else
#define debug_print if(errno && !errno)printf
#endif

int main(void)
{
	int i=777;
	debug_print("%d \n",i);

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

やまっち
記事: 20
登録日時: 10年前

Re: デバッグ時にのみ printf として機能する仕組み

#7

投稿記事 by やまっち » 10年前

あごみつさん
みけCATさん
回答して頂いてありがとうございました。
あごみつさんの方法 (可変長引数マクロ) は bcc55 でも
コンパイルでき、動作も正しくしているようです。
参考にさせて頂きます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る