为程序添加详细程度

时间:2012-04-16 15:55:02

标签: c++ c linux verbosity

这是一个非常n00b的问题但是 我正在编写一个基于nix的工具,并希望有详细的标志,根据传入的vvv的数量,我将在我的程序中打印调试/信息语句。

我的问题是我将如何使用opargs,因为optargs一次只能解析一个字符。

另外假设我知道我的级别是3级,我的所有打印语句都必须处于if状态吗?或者有一种使用预处理器的巧妙方法吗?

此外,如果有人可以指向我在网上执行此操作的代码,那将是非常棒的。

由于

我弄明白了,以为如果其他人在将来遇到这个问题我会发布在这里:

基本上,对于我所有不同的冗长语句,我使用预处理器定义了一个特殊的打印,如:

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

然后我根据需要在代码中加入声明,例如

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

我的选择看起来像这样

case 'v':
    verbosity++;
break;

3 个答案:

答案 0 :(得分: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
}

编辑:记录的Saner条件。特别是如果你想要在详细级别上升时进行包容性记录......

答案 1 :(得分:1)

Conditional compilation怎么样?

您还可以通过设置详细级别的数字来简化,而不是传递那么多 v&#39>

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

答案 2 :(得分: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;
}

这会给你类似以下内容:

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

从那里你应该能够使用vlevel变量[在main()]中在相关的详细级别中打印正确的消息。