Open huangblue opened 7 years ago
试了一下,DEBUG与DEBUG使用后效果上没有区别。
但在命令行中,用-D DEBON的参数就没有效果。 只有在程序中修改。
//方法二示例程序 //阅读版本
void debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }
void debug(const char *fmt, ...) { }
int fact(int n) { int i, f = 1; for( i=1; i<=n; i++) { f *= i; debug("i=%d ; f=%d\n", i, f); } return f; } int main() { printf( "4!=%d\n", fact(4) ); return 0; }
//方法二示例程序 //运行版本
void debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }
void debug(const char *fmt, ...) { }
int fact(int n) { int i, f = 1; for( i=1; i<=n; i++) { f *= i; debug("i=%d ; f=%d\n", i, f); } return f; } int main() { printf( "4!=%d\n", fact(4) ); return 0; }
有语句:
结果是这样的: i=1 ; f=1 i=2 ; f=2 i=3 ; f=6 i=4 ; f=24 4!=24
Process returned 0 (0x0) execution time : 0.020 s Press any key to continue.
无语句:
结果是这样的: 4!=24
Process returned 0 (0x0) execution time : 0.031 s Press any key to continue.
//方法三示例程序 //阅读版本
int debug_level; void debug(int level, const char *fmt, ...) { if( level <= debug_level ) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } }
int fact(int n) { int i, f = 1; for( i=1; i<=n; i++) { f = i; debug(250, "i=%d ; f=%d\n", i, f); } return f; } int main(int argc, char argv[]) { if ( argc < 2 ) { debug_level = 0; } else { debug_level = atoi(argv[1]); } printf( "4!=%d\n", fact(4) ); return 0; }
//命令行无参数时的运行结果: 4!=24
Process returned 0 (0x0) execution time : 0.031 s Press any key to continue.
//命令行参数不小于250 D:\常用目录\hdf\c\test>fact 250 i=1 ; f=1 i=2 ; f=2 i=3 ; f=6 i=4 ; f=24 4!=24
//命令行参数小于250 D:\常用目录\hdf\c\test>fact 249 4!=24
//方法四示例程序 //阅读版本
int debug_level;
if( level <= debug_level ) __debug(fmt, ##arg)
void __debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }
int fact(int n)
{ int i, f = 1; for( i=1; i<=n; i++) { f = i; debug(250, "i=%d ; f=%d\n", i, f); } return f; } int main(int argc, char argv[]) { if ( argc < 2 ) { debug_level = 0; } else { debug_level = atoi(argv[1]); } printf( "4!=%d/n", fact(4) ); return 0; }
//方法四示例程序 //运行版本
int debug_level;
if( level <= debug_level ) __debug(fmt, ##arg)
void __debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }
int fact(int n)
{ int i, f = 1; for( i=1; i<=n; i++) { f = i; debug(250, "i=%d ; f=%d\n", i, f); } return f; } int main(int argc, char argv[]) { if ( argc < 2 ) { debug_level = 0; } else { debug_level = atoi(argv[1]); } printf( "4!=%d/n", fact(4) ); return 0; }
//命令行无参数时的运行结果: 4!=24/n Process returned 0 (0x0) execution time : -0.000 s Press any key to continue.
//命令行参数不小于250的结果: D:\常用目录\hdf\c\test>fact 260 i=1 ; f=1 i=2 ; f=2 i=3 ; f=6 i=4 ; f=24 4!=24
//命令行参数小于250的结果: D:\常用目录\hdf\c\test>fact3 11 4!=24/n
这个方法将宏与调试函数结合起来了。 函数中只出现宏。 宏里面作判断,合乎才调用调试函数。 这样,如果不需要输出调试信息,增加的是一次整数的判断而不是一次函数调用。
//方法五示例程序my_debug.h
// 模块功能号 enum { MY_SECTION_FACT = 0, MY_SECTION_nnn1, MY_SECTION_nnn2, MY_SECTION_nnnn, MY_SECTION_END, };
// 非my_debug.c文件的外部变量声明 //my_debug.c中定义了MY_DEBUG_C
extern int __my_allow_debug_levels[MY_SECTION_END];
// (内部使用) 判断"SECTION"模块功能号是否允许"DEBUG_LEVEL"等级的调试信息输出 //函数fact中使用了宏my_debug,它又使用了本宏
( DEBUG_LEVEL > __my_allow_debug_levels[SECTION] )
// (内部使用) 调试信息输出函数 //函数fact中使用了宏my_debug,它又使用了本宏
printf("%s:%d %s: " FORMAT, FILE, LINE, FUNCTION, ##ARG)
// 初始化"SECTION"模块功能号的调试等级 //main函数中使用两次
( __my_allow_debug_levels[SECTION] = ALLOW_DEBUG_LEVEL )
// 调试信息输出函数,该信息为"SECTION"模块功能号"DEBUG_LEVEL"等级的调试信息 //函数 fact中使用
( __my_unallow_debug(SECTION, DEBUG_LEVEL) ) ? (void) 0 : __my_debug
//方法五示例程序my_debug.c
int __my_allow_debug_levels[MY_SECTION_END];
//方法五应用程序fact.c //阅读版本
int fact(int n) { int i, f = 1; for( i=1; i<=n; i++) { f = i; my_debug(MY_SECTION_FACT, 250)("i=%d ; f=%d\n", i, f); } return f; } int main(int argc, char argv[]) { if ( argc < 2 ) { my_init_debug_levels(MY_SECTION_FACT, 0); } else { my_init_debug_levels(MY_SECTION_FACT, atoi(argv[1])); } printf( "4!=%d\n", fact(4) ); return 0; }
//方法五应用程序fact.c //运行版本
int fact(int n) { int i, f = 1; for( i=1; i<=n; i++) { f = i; my_debug(MY_SECTION_FACT, 250)("i=%d ; f=%d\n", i, f); } return f; } int main(int argc, char argv[]) { if ( argc < 2 ) { my_init_debug_levels(MY_SECTION_FACT, 0); } else { my_init_debug_levels(MY_SECTION_FACT, atoi(argv[1])); } printf( "4!=%d\n", fact(4) ); return 0; }
编译命令:
gcc fact.c my_debug.c -o fact
参数小于250: D:\常用目录\hdf\c\test>fact 1 4!=24
参数不小于250: D:\常用目录\hdf\c\test>fact 250 fact.c:12 fact: i=1 ; f=1 fact.c:12 fact: i=2 ; f=2 fact.c:12 fact: i=3 ; f=6 fact.c:12 fact: i=4 ; f=24 4!=24
方法一:直接使用屏幕打印函数printf。 方法二:自定义调试函数debug。 方法三:含调试等级的自定义调试函数debug。 方法四:调试等级的判断放在自定义调试函数debug之外。 方法五:根据不同的功能模块分别定义不同的调试等级。