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版本,但您可以轻松地将其更改为单字节版本):
您可以通过更改globalglobal\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;