huangblue / c

0 stars 0 forks source link

使用调试函数来输出错误信息 #57

Open huangblue opened 7 years ago

huangblue commented 7 years ago

方法一:直接使用屏幕打印函数printf。 方法二:自定义调试函数debug。 方法三:含调试等级的自定义调试函数debug。 方法四:调试等级的判断放在自定义调试函数debug之外。 方法五:根据不同的功能模块分别定义不同的调试等级。

huangblue commented 7 years ago

试了一下,DEBUG与DEBUG使用后效果上没有区别。

但在命令行中,用-D DEBON的参数就没有效果。 只有在程序中修改。

huangblue commented 7 years ago

//方法二示例程序 //阅读版本

include

define __DEBUG__

ifdef __DEBUG__

include

void debug(const char *fmt, ...) {    va_list ap;   va_start(ap, fmt);   vprintf(fmt, ap);   va_end(ap); }

else

void debug(const char *fmt, ...) { }

endif

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; }

huangblue commented 7 years ago

//方法二示例程序 //运行版本

include

define DEBUG

ifdef DEBUG

include

void debug(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); }

else

void debug(const char *fmt, ...) { }

endif

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; }

huangblue commented 7 years ago

有语句:

define __DEBUG__

结果是这样的: 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.

huangblue commented 7 years ago

无语句:

define __DEBUG__

结果是这样的: 4!=24

Process returned 0 (0x0) execution time : 0.031 s Press any key to continue.

huangblue commented 7 years ago

//方法三示例程序 //阅读版本

include

include / atoi() /

include

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; }

huangblue commented 7 years ago

//命令行无参数时的运行结果: 4!=24

Process returned 0 (0x0) execution time : 0.031 s Press any key to continue.

huangblue commented 7 years ago

//命令行参数不小于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

huangblue commented 7 years ago

//命令行参数小于250 D:\常用目录\hdf\c\test>fact 249 4!=24

huangblue commented 7 years ago

//方法四示例程序 //阅读版本

include

include / atoi() /

include

int debug_level;

define debug(level, fmt, arg...) \

    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; }

huangblue commented 7 years ago

//方法四示例程序 //运行版本

include

include / atoi() /

include

int debug_level;

define debug(level, fmt, arg...) \

    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; }

huangblue commented 7 years ago

//命令行无参数时的运行结果: 4!=24/n Process returned 0 (0x0) execution time : -0.000 s Press any key to continue.

huangblue commented 7 years ago

//命令行参数不小于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

huangblue commented 7 years ago

//命令行参数小于250的结果: D:\常用目录\hdf\c\test>fact3 11 4!=24/n

这个方法将宏与调试函数结合起来了。 函数中只出现宏。 宏里面作判断,合乎才调用调试函数。 这样,如果不需要输出调试信息,增加的是一次整数的判断而不是一次函数调用。

huangblue commented 7 years ago

//方法五示例程序my_debug.h

ifndef MY_DEBUG_H

define MY_DEBUG_H

include

// 模块功能号 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

ifndef MY_DEBUG_C

extern int __my_allow_debug_levels[MY_SECTION_END];

endif

// (内部使用) 判断"SECTION"模块功能号是否允许"DEBUG_LEVEL"等级的调试信息输出 //函数fact中使用了宏my_debug,它又使用了本宏

define __my_unallow_debug(SECTION, DEBUG_LEVEL) \

( DEBUG_LEVEL > __my_allow_debug_levels[SECTION] )

// (内部使用) 调试信息输出函数 //函数fact中使用了宏my_debug,它又使用了本宏

define __my_debug(FORMAT, ARG...) \

printf("%s:%d %s: " FORMAT, FILE, LINE, FUNCTION, ##ARG)

// 初始化"SECTION"模块功能号的调试等级 //main函数中使用两次

define my_init_debug_levels(SECTION, ALLOW_DEBUG_LEVEL) \

( __my_allow_debug_levels[SECTION] = ALLOW_DEBUG_LEVEL )

// 调试信息输出函数,该信息为"SECTION"模块功能号"DEBUG_LEVEL"等级的调试信息 //函数 fact中使用

define my_debug(SECTION, DEBUG_LEVEL) \

     ( __my_unallow_debug(SECTION, DEBUG_LEVEL) ) ? (void) 0 : __my_debug

endif //MY_DEBUG_H

huangblue commented 7 years ago

//方法五示例程序my_debug.c

define MY_DEBUG_C

include "my_debug.h"

int __my_allow_debug_levels[MY_SECTION_END];

huangblue commented 7 years ago

//方法五应用程序fact.c //阅读版本

include

include

include "my_debug.h"

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; }

huangblue commented 7 years ago

//方法五应用程序fact.c //运行版本

include

include

include "my_debug.h"

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; }

huangblue commented 7 years ago

编译命令:

gcc fact.c my_debug.c -o fact

huangblue commented 7 years ago

参数小于250: D:\常用目录\hdf\c\test>fact 1 4!=24

huangblue commented 7 years ago

参数不小于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