C++ 生成详细输出的最佳实践是什么?

C++ 生成详细输出的最佳实践是什么?,c++,verbosity,C++,Verbosity,生成详细输出的最佳实践是什么?目前,我有一个函数 bool verbose; int setVerbose(bool v) { errormsg = ""; verbose = v; if (verbose == v) return 0; else return -1; } 每当我想产生输出时,我都会做如下的事情 if (debug) std::cout << "deleting interp" <&l

生成详细输出的最佳实践是什么?目前,我有一个函数

bool verbose;
int setVerbose(bool v)
{
    errormsg = "";
    verbose = v;
    if (verbose == v)
        return 0;
    else
        return -1;
}
每当我想产生输出时,我都会做如下的事情

if (debug)
     std::cout << "deleting interp" << std::endl;
class Trace {
   public:
      enum { Enable, Disable } state;
   // ...
   operator<<(...)
};
trace << Trace::Enable;
trace << "deleting interp"
if(调试)

std::cout您可以使用

您可以将您的功能包装在一个支持
int threshold=3的类中;
类mystreambuf:public std::streambuf
{
};
mystreambuf nostreambuf;
标准::ostream nocout(和nostreambuf);
#定义日志(x)((x>=阈值)?std::cout:nocout)
int main()
{

log(1)最简单的方法是创建如下小型类(这里是Unicode版本,但您可以轻松地将其更改为单字节版本):


您可以通过更改global
global\u level
变量在运行时更改详细级别。

1。如果您使用的是g++,则可以使用-D标志,这允许编译器定义您选择的宏

定义

例如:

#ifdef DEBUG_FLAG
 printf("My error message");
#endif
2.我同意这也不雅观,所以为了让它更漂亮一点:

void verbose(const char * fmt, ... )
{
va_list args;  /* Used as a pointer to the next variable argument. */
va_start( args, fmt );  /* Initialize the pointer to arguments. */

#ifdef DEBUG_FLAG
printf(fmt, &args);  
#endif
/*This isn't tested, the point is to be able to pass args to 
printf*/
}
可以像printf一样使用:

verbose("Error number %d\n",errorno);

<强> 3。< /强>第三的解决方案更容易,更多的C++和UNIX类是将参数传递给您将使用的程序——作为宏更早-初始化一个特定变量(可能是全局const)。 例如: 美元/我的计划-v

if(optarg('v')) static const verbose = 1;

那有异步日志记录功能吗?我不知道它有没有。抱歉。我同意答案是使用正确的日志记录库,而不是手工编码,尽管Log4cpp似乎已经奄奄一息了。另一方面,它是活跃的。根据网站,它确实支持异步日志记录,尽管我没有我认为这与这个问题有关。我喜欢在类中包装一个错误记录系统的想法。你也可以在类中存储输出文件的位置之类的东西。只是为了让我正确地理解你:我会创建一个名为Trace的Trace类实例。然后问另一个问题:为什么Trace::Enable足以设置在C++中,我还是相当新的,我有点困惑。也许你的想法中有三条线会帮助我更好地理解正在发生的事情。但是我绝对喜欢你的想法!是的,你需要创建一个THE类的实例;这可以是静态的或局部的,每个希望使用它的组件。le将在跟踪类(状态枚举的实例)内切换内部标志。这与std::hex非常相似,它允许std::cout以十六进制格式而不是十进制格式输出。由于您将要编写运算符和reash,
Trace::Enable
足以将状态设置为
Enable
,因为您将为
编写代码,您的
setVerbose
是否总是返回0?是的,除非有其他原因发生了一件非常深奥的事情。只是我有一大堆设置()如果操作成功,所有函数都返回0,如果不成功,则返回-1。因此,这只是一个具有一致接口的问题…我不理解此代码。这是编辑出错的情况吗?是否有可能将std::endl“包括”到log()定义中?定义
log(x)
可以很容易地替换为内联函数。这里有理由使用defines吗?关于std::endl:我所知没有。如果你想要更少的代码,你可以使用typedef,比如_e.Regardig#define/inline:no reason。我喜欢这个答案。我真的只需要这个非常简单的标准日志,不需要任何文件/网络的东西(我希望)。因此,我将尽量减少外部依赖项的数量,并采用自己的实现。我发现这个解决方案非常聪明,非常有用,我希望我能给它10次投票!:-)我相信全局_级别变量在翻译单元中会有问题,对吗?你将如何实现这个变量?只需将它放在
命名空间中
@quimnuss
void verbose(const char * fmt, ... )
{
va_list args;  /* Used as a pointer to the next variable argument. */
va_start( args, fmt );  /* Initialize the pointer to arguments. */

#ifdef DEBUG_FLAG
printf(fmt, &args);  
#endif
/*This isn't tested, the point is to be able to pass args to 
printf*/
}
verbose("Error number %d\n",errorno);
if(optarg('v')) static const verbose = 1;