cwnicol programming

プログラミング関連の投稿をすこしだけ

#ifdef、#endifを使わないデバッグprint

#include <cstdio>
using namespace std;

#define DEBUG

#ifdef DEBUG
#	define DEBUG_PRINTF(message)   fprintf(stderr, message)
#	define DEBUG_PRINTF2(f, a, b)  fprintf(stderr, f, a, b)
#else
#	define DEBUG_PRINTF(message)   
#	define DEBUG_PRINTF2(f, a, b)
#endif


int main(){
	//printf("Hello world!");

	DEBUG_PRINTF("テスト 出力\n");

	return 0;

}


これだと書き込みバッファに溜まってすぐに出てこないときがあるので、
エラーログ出力用関数を可変長マクロかなんかでつくっておいて、
その関数呼び出しに対してこれを適用するといいかもしれない。


可変長マクロ
http://proger.blog10.fc2.com/blog-entry-33.html



エラーログ出力用関数では呼び出しの度にファイルをオープン、書き込み、クローズを
行う。日時が出るとうれしい。
そんで、そのファイルをtail XXXX.log -f で監視する。

                                                                                                                    • -

tail -f について最近こんな記事が↓
「tail -f」を使うのは情弱、情強は「less +F」を使う
http://www.softantenna.com/wp/unix/stop-using-tail-f/

                                                                                                                    • -

Linuxプログラムでは、これでネットワークインタフェース周りや根元の関数の始まり
終わりを出すようにしないと泣けるかも。
Eclipce?Emacs?がある環境では必要ないか 使ったことないから分かんね



追記:
一部修正(2009/01/12) :

作った。

#include <sys/time.h>
#include <time.h>
#include <stdio.h>


#define DEBUG


FILE *fp = NULL;



#ifdef DEBUG
/*
#	define DEBUG_PRINT(Fmt, ...)  fp = fopen("/xxx/yyy/zzz/hoge.log", "ab");\
	                              if(fp){\
	                                  DebugInfoPrint(fp, __FILE__, __LINE__, __func__);\
	                                  fprintf(fp, Fmt, __VA_ARGS__);\
	                                  fclose(fp);\
	                              }
*/
#	define DEBUG_PRINT(Fmt, ...)  DebugInfoPrint(stdout, __FILE__, __LINE__, __func__);\
	                              fprintf(stdout, Fmt, __VA_ARGS__);
#else
#	define DEBUG_PRINT(Fmt, ...)   
#endif

void DebugPrint();




int main(){
	DEBUG_PRINT("%s\n", "テスト 出力");
	DEBUG_PRINT("%s %d\n", "テスト 出力2", 100);
	DEBUG_PRINT("%s %ld %s\n", "テスト 出力3", 50000, "ささささ");
	return 0;
}



void DebugInfoPrint(FILE *fp, char *pcFile, long lLine, char *pcFunc){

	struct timeval tv;
	struct tm *tmptr = NULL;

	gettimeofday(&tv, NULL);
	tmptr = localtime(&tv.tv_sec);

	fprintf(fp, "%04d/%2d/%2d %2d:%2d.%2d.%03d, %15s, %5ld, %20s, ", 
		tmptr->tm_year + 1900,
		tmptr->tm_mon + 1,
		tmptr->tm_mday,
		tmptr->tm_hour,
		tmptr->tm_min,
		tmptr->tm_sec,
		tv.tv_usec/1000,
		pcFile,
		lLine,
		pcFunc);

	return;
}

実行結果:

2009/ 1/12 7: 5.29.140, t.c, 35, main, テスト 出力
2009/ 1/12 7: 5.29.142, t.c, 36, main, テスト 出力2 100
2009/ 1/12 7: 5.29.142, t.c, 37, main, テスト 出力3 50000 ささささ

DEBUG_PRINT("%s %d\n", "テスト 出力2", 100);

みたいに書けば上のように出力される。



追記2(2009/01/12) :

なんか上記のコードではコンパイルが失敗する環境があるみたい
(ライブラリのバグ?)なので、該当部分を使用しない(ミリ秒部分)コードが以下。

#include <time.h>
#include <stdio.h>


#define DEBUG


FILE *fp = NULL;



#ifdef DEBUG
/*
#	define DEBUG_PRINT(Fmt, ...)  fp = fopen("/xxx/yyy/zzz/hoge.log", "ab");\
	                              if(fp){\
	                                  DebugInfoPrint(fp, __FILE__, __LINE__, __func__);\
	                                  fprintf(fp, Fmt, __VA_ARGS__);\
	                                  fclose(fp);\
	                              }
*/
#	define DEBUG_PRINT(Fmt, ...)  DebugInfoPrint(stdout, __FILE__, __LINE__, __func__);\
	                              fprintf(stdout, Fmt, __VA_ARGS__);
#else
#	define DEBUG_PRINT(Fmt, ...)   
#endif

void DebugPrint();




int main(){
	DEBUG_PRINT("%s\n", "テスト 出力");
	DEBUG_PRINT("%s %d\n", "テスト 出力2", 100);
	DEBUG_PRINT("%s %ld %s\n", "テスト 出力3", 50000, "ささささ");
	return 0;
}



void DebugInfoPrint(FILE *fp, char *pcFile, long lLine, char *pcFunc){

	time_t timer;
	struct tm *tmptr;

	timer = time(NULL);        
	tmptr= localtime(&timer);  


	fprintf(fp, "%04d/%2d/%2d %2d:%2d.%2d, %15s, %5ld, %20s, ", 
		tmptr->tm_year + 1900,
		tmptr->tm_mon + 1,
		tmptr->tm_mday,
		tmptr->tm_hour,
		tmptr->tm_min,
		tmptr->tm_sec,
		pcFile,
		lLine,
		pcFunc);

	return;
}

実行結果:

2009/ 1/12 7:13.29, t.c, 34, main, テスト 出力
2009/ 1/12 7:13.29, t.c, 35, main, テスト 出力2 100
2009/ 1/12 7:13.29, t.c, 36, main, テスト 出力3 50000 ささささ