2012-04-16 76 views
1

這是一個非常難的問題,但是 我正在編寫一個基於nix的工具,並希望根據vvv的傳遞數量來設置詳細標誌,我將在其中打印調試/信息語句我的程序。爲程序添加詳細程度

我的問題是我將如何去使用opargs,因爲optargs一次只能解析一個字符。

另外假設我知道我在冗長級別3,我的所有打印語句都必須處於if條件嗎?或者有一種巧妙的方式來使用預處理器來實現它?

此外,如果有人可以指向我的一些在線代碼這樣做,那將是非常棒的。

感謝

我搞清楚,以爲我會在這裏發表如果別人遇到這樣的未來:

基本上我的所有不同的冗長髮言,我定義使用預處理像一個特殊的打印:

#define dprintf \ 
    if (verbosity == 1) printf 

我再放入報表需要的代碼如

dprintf ("Verbosity is at level 1."); 

我選擇ATGS看起來像這樣

case 'v': 
    verbosity++; 
break; 
+0

您是否嘗試過使用字符串「-vvv」的選項解析機制?通常,如果存在這種能力,則將其處理爲「-v -v -v」。否則,您可以始終定義三個標誌「-v」,「-vv」和「-vvv」,並使用這些標誌設置調試級別。無論哪種方式,這都是一個小竅門。但你只做一次。 – HonkyTonk 2012-04-16 16:03:05

+0

然後我可以使用預處理器來定義一個特殊的「打印」語句並使用它打印出詳細的選項? – Falcata 2012-04-16 16:04:14

+0

爲什麼不只是'-v1','-v2','-v3'等? – 2012-04-16 16:07:04

回答

1

如何Conditional compilation

您還可以通過設置詳細級別的數字來簡化,而不是通過那麼多v的

#if VERBOSE_LEVEL == 3 
    print("A verbose message"); 
#endif 
+0

我認爲他的意思是冗長級別是由命令行標誌決定的,這會使其成爲運行時測試,而不是編譯時間。 – Matt 2012-04-16 16:22:06

3

詳細級別在編譯時不知道,因此您需要準備好代碼以處理用戶選擇的任何級別。

一個簡單且易於理解的方法是將不透明編譯單元中的日誌函數與靜態變量分開,以記錄詳細級別。然後用「set_logging_level(level)」之類的東西來初始化它,並編寫由這個靜態變量保護的日誌記錄功能。然後你只會公開初始化和日誌記錄功能,並在你的代碼中使用它們。

static level = 0; 
void set_logging_level(int l) { level = l; } 

void log_info(char* msg) { 
    // Will always print 
} 

void log_debug(char *msg) { 
    if(level > 0) 
    // Write to stdout or stderr, whichever fits 
} 

void log_details(char *msg) { 
    if(level > 1) 
    // As above 
} 

void log_insanity(char *msg) { 
    if(level > 2) 
    // As above 
} 

編輯:伐木的條件。特別是如果你要包容記錄時的詳細級別上升...

+0

我會這樣做,除了使用可變參數函數和'vprintf'。或者如果由於某種原因你沒有'vprintf',你可能仍然需要使用一個宏。 [vprintf的頂級google結果](http://www.cplusplus.com/reference/clibrary/cstdio/vprintf/)就是一個很好的例子。 – 2012-04-16 16:31:56

0

我也不太清楚,如果這是你的意思,但是這是我如何在另一個項目中實現它:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define TRUE 1 
#define FALSE 0 

int usage(char *name, int quit); 

int main (int argc, char **argv) { 
    int c; 
    static int vlevel = 0; 

    while ((c = getopt(argc, argv, ":abc:d:hv012")) != -1) { 
     int this_option_optind = optind ? optind : 1; 
     switch (c) { 

      case 'v': 
       vlevel++; 
       printf ("verbosity level is %d\n", vlevel); 
       break; 

      case ':':  /* Option without required operand */ 
       fprintf(stderr, "option -%c requires an operand\n", optopt); 
       break; 

      case 'h': 
      case '?': 
       usage(argv[0], TRUE); 
       break; 

      default: 
       printf ("?? getopt returned character code 0%o ??\n", c); 
     } 
    } 

    if (optind < argc) { 
     printf ("non-option ARGV-elements:\n"); 
     while (optind < argc) 
      printf ("\t%s\n", argv[optind++]); 
    } 

    exit (0); 
} 

int usage(char *progname, int quit) 
{ 
    printf ("Usage:\n\t%s [-vh]\n", progname); 
    if (quit) exit(1); 
    return 0; 
} 

這將使你像下面這樣:

[email protected]:~$ ./testverbose -h 
Usage: 
    ./testverbose [-vh] 
[email protected]:~$ ./testverbose -vvvv 
verbosity level is 1 
verbosity level is 2 
verbosity level is 3 
verbosity level is 4 
[email protected]:~$ 

從那裏,你應該能夠使用相關的詳細級別在vlevel變量[在main()]打印正確的消息。