向程序添加详细程度

Adding Verbosity to a Program

本文关键字:程度 添加 程序      更新时间:2023-10-16

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

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

另外,假设我知道我处于详细级别 3,我所有的打印语句都必须处于 if 条件吗?或者有一种使用预处理器的聪明方法?

此外,如果有人可以在线指出一些执行此操作的代码,那就太棒了。

谢谢

我想通了,以为如果将来其他人遇到这个,我会在这里发布:

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

#define dprintf 
    if (verbosity == 1) printf

然后,我根据需要在代码中输入语句,例如

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

我的选择看起来像这样

case 'v':
    verbosity++;
break;

详细级别在编译时是未知的,因此您需要准备好代码来处理用户选择的任何级别。

一种简单且易于理解的方法是将日志记录函数分离到一个不透明的编译单元中,并使用静态变量跟踪详细级别。然后,您可以使用类似"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
}

编辑:更合理的日志记录条件。特别是如果您希望在详细级别上升时进行非独占日志记录......

条件编译怎么样?

您还可以通过为详细级别设置一个数字来简化,而不是传递那么多 v

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

我不太确定这是否是你的意思,但这就是我在另一个项目中实现它的方式:

#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 %dn", vlevel);
                break;
            case ':':       /* Option without required operand */
                fprintf(stderr, "option -%c requires an operandn", 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%sn", argv[optind++]);
    }
    exit (0);
}
int usage( char *progname, int quit )
{
    printf ( "Usage:nt%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 变量 [in main()] 在相关的详细级别打印正确的消息。