想要執行時期再決定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

留言

這個網誌中的熱門文章

[C語言]宣告陣列的大小是0 ???

利用net-snmp 的mib2c,由一個MIB檔產出一個可執行的AgentX 程式

ubuntu 16.04開機遇到 flip_done timed out 的問題