2012-04-16 78 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()]打印正确的消息。