向程序添加详细程度
Adding Verbosity to a Program
这是一个非常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()] 在相关的详细级别打印正确的消息。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 向程序添加详细程度