想要執行時期再決定log 是否輸出的功能該怎麼辦?
一般來說,工程師會在開發階段儘量把工作流程用log 的方式顯示到console,最常用的就是printf(),以利 debug.
等到build release 後,再把log 關掉.
最早最笨的方法,就是build release 的時候,工程師一行一行的把程式碼砍掉,然後編譯.恩,這的確非常的原始.
後來經過演化,工程師學會了使用Macro的方式來開啟跟關閉log.然後再編譯的時候定義不同的Macro define 來build出有log的版本或沒有log的版本.所以我們常常就會看到很多
#ifdef DEBUG
...
...
#else
...
...
#endif
恩,這的確可以在地球上存活.
不過我需要一個特別的功能,在程式執行的時候才決定log 是否要輸出.最常遇到的需求就是使用者可以用不同的命令列參數開啟或關閉log.最直覺的方法就是stdout重新導向,這也是一個好方法,不過還有一個方法可以提供給大家.
int (*run_log)( const char* format, ...);
int my_log( const char* format, ...);
int my_log( const char* format, ...)
{
return 0;
}
int main(int argc,char** argv)
{
if(argc > 1 && strcmp(argv[1],"debug") == 0)
run_log = printf;
else
run_log = my_log;
run_log("log start\n");
}
這樣,使用者可以執行時帶入debug 命令列參數來開啟log
等到build release 後,再把log 關掉.
最早最笨的方法,就是build release 的時候,工程師一行一行的把程式碼砍掉,然後編譯.恩,這的確非常的原始.
後來經過演化,工程師學會了使用Macro的方式來開啟跟關閉log.然後再編譯的時候定義不同的Macro define 來build出有log的版本或沒有log的版本.所以我們常常就會看到很多
#ifdef DEBUG
...
...
#else
...
...
#endif
恩,這的確可以在地球上存活.
不過我需要一個特別的功能,在程式執行的時候才決定log 是否要輸出.最常遇到的需求就是使用者可以用不同的命令列參數開啟或關閉log.最直覺的方法就是stdout重新導向,這也是一個好方法,不過還有一個方法可以提供給大家.
int (*run_log)( const char* format, ...);
int my_log( const char* format, ...);
int my_log( const char* format, ...)
{
return 0;
}
int main(int argc,char** argv)
{
if(argc > 1 && strcmp(argv[1],"debug") == 0)
run_log = printf;
else
run_log = my_log;
run_log("log start\n");
}
這樣,使用者可以執行時帶入debug 命令列參數來開啟log
留言