C言語関係掲示板

過去ログ

No.1024 デバッグ用出力方法について

[戻る] [ホームページ]
No.13036

デバッグ用出力方法について
投稿者---点一(2004/03/04 01:37:16)


点一と申します。よろしくお願いいたします。

不特定多数の場所でデバッグメッセージを出力する為に、共通関数を作成
(ライブラリ化)するつもりなのですが、以下の条件をクリアするように
作成することは可能でしょうか?

事前条件
 出力メッセージとして、数値、文字列、数値と文字列混在の3パターンが存在
条件

1.デバッグ出力用の共通関数の呼び出しをコンパイル時に読み込まない。
2.#ifdefを個別に定義しない。(デバッグ関数を使用する度に記述しない。)
  (共通のヘッダファイルに一ヶ所登録がベスト?)
3.デバッグ出力に関係するコードもコンパイル時に読み込まない。
  例
  sprinf(pcString,"%d",i); /*この部分もコンパイル時に読み込まない*/
  debugout("xxx.log",pcString);

条件「3.」は難しそうなので、無理なようであれば、
条件「1.」「2.」をクリア出来る方法を教えていただけないでしょうか。

文が長くなり申し訳ありませんが、どうかよろしくお願いします。

No.13037

Re:デバッグ用出力方法について
投稿者---YuO(2004/03/04 01:49:03)


>1.デバッグ出力用の共通関数の呼び出しをコンパイル時に読み込まない。
>3.デバッグ出力に関係するコードもコンパイル時に読み込まない。

コンパイル時に読み込まないとは?
コンパイルしないのであれば,デバッグ用にならないですが。


>2.#ifdefを個別に定義しない。(デバッグ関数を使用する度に記述しない。)
>  (共通のヘッダファイルに一ヶ所登録がベスト?)

ヘッダファイルで切り分ければ問題ないと思います。


仕様がはっきりしないですが,とりあえずデバッグ出力用として簡単なのものを作るとすると,
#ifndef NDEBUG
void DebugOut (const char *, ...);
#else
#define DebugOut (void)
#endif

なんていうヘッダファイルを用意しておいて,別の翻訳単位に
#include <stdio.h>
#include <stdarg.h>
void DebugOut (const char * format, ...)
{
    va_list ap;
    va_start(ap, format);
    vfprintf(stderr, format, ap);
    va_end(ap);
}

なんて関数を用意するだけです。

例えば,
DebugOut("%d", i);
というコードは,デバッグ用のプログラムをコンパイルした場合であれば関数DebugOutを直接呼び出しますが,
リリース用のプログラム(NDEBUGを定義している)をコンパイルした場合であれば,
(void)("%d", i);
となり,無作用の文なのでおそらく最適化で削除されます。
また,関数呼び出しや副作用を持つ式を含んでも,問題なく実行されます。


No.13038

Re:デバッグ用出力方法について
投稿者---点一(2004/03/04 14:13:23)


質問が悪かった用で申し訳ありません。
何を言いたかったかといいますと、
void main(){
 char *pcstrData;
 int i;
 ...... 中略
#ifndef NDEBUG
 sprintf(pcMessage,"%s%d",pcstrData,i);
 debuglog("xxx.txt",pcMessage)
#endif
 ...... 中略
#ifndef NDEBUG
 sprintf(pcMessage,"%s%s%d",pcstrData,pcstrData2,i);
 debuglog("xxx.txt",pcMessage)
#endif
 ...... 中略
}

ライブラリ
debuglog(char * pcFile,char * pcMessage){
 pcMessageをpcFileに出力する処理を記述する。
}

上記のような処理の場合に、毎回#ifndefを記述しないですむ方法について
教えていただきたかったのです。
(sprintfはデバッグのためだけに存在するので、
 リリース時には消しておきたい。)

教えていた方法を試してみたいと思います。
ありがとうございました。