// * C #contents * マクロ ** TRACE #ifndef __TRACE_H__ #define __TRACE_H__ #include <stdio.h> #include <stdlib.h> #ifdef _MSC_VER #include <stdarg.h> #endif // 有効にする #ifndef NDEBUG #define __ENABLE_TRACE__ #endif //====================================== // デバッグ用の処理 #ifdef __ENABLE_TRACE__ // ASSERT #define ASSERT(condition) \ if (!(condition)) {\ fprintf(stderr,"%s %d: assertion failed ! %s\n",__FILE__,__LINE__,#condition); \ exit(-1); \ } //-------------------------------------- // VC++ #ifdef _MSC_VER // TRACE #define TRACE _tracemacro_trace inline void _tracemacro_trace(const char *format, ...) { va_list va; va_start(va, format); vfprintf(stderr, format, va); va_end(va); } // ASSERT_TRACE /* condition ファイル名 行表示ができない */ #define ASSERT_TRACE _tracemacro_assert_trace inline void _tracemacro_assert_trace(int condition, const char *format, ...) { if (condition) return; va_list va; va_start(va, format); fprintf(stderr,"assertion failed !\n"); vfprintf(stderr, format, va); va_end(va); exit(-1); } //-------------------------------------- // それ以外 #else // _MSC_VER #define TRACE(fmt,...) fprintf(stderr,fmt,##__VA_ARGS__) #define ASSERT_TRACE(condition,fmt,...) \ if (!(condition)) {\ fprintf(stderr,"%s %d: assertion failed ! %s\n",__FILE__,__LINE__,#condition); \ fprintf(stderr,fmt,##__VA_ARGS__); \ exit(-1); \ } #endif // _MSC_VER //====================================== // リリース時 #else // __ENABLE_TRACE__ #define ASSERT(condition) ((void)0) //-------------------------------------- // VC++ #ifdef _MSC_VER #define TRACE if(1);else _tracemacro_null_func #define ASSERT_TRACE if(1);else _tracemacro_null_func inline void _tracemacro_null_func(...) { } //-------------------------------------- // それ以外 #else #define TRACE(fmt,...) ((void)0) #define ASSERT_TRACE(condition,fmt,...) ((void)0) #endif // _MSC_VER #endif // __ENABLE_TRACE__ #endif // __TRACE_H__