我正在寻找一种能够以最少的日志代码自动输出日志的解决方案。我需要记录函数进入和退出的行号。
例如:在文件example.cpp中
Line 1 : void Fun1()
Line 2 : {
Line 3 : AUTO_LOG_MACRO;
Line 4 : //do something 1
Line 5 : //do something 2
Line 6 : return;
Line 7 : }
Line 8 :
Line 9 : void Fun2()
Line 10 : {
Line 11 : AUTO_LOG_MACRO;
Line 12 : //do something 1
Line 13 : //do something 2
Line 14 : Func1();
Line 15 : //do something 1
Line 16 : //do something 2
Line 17 : return;
Line 18 : }
那么日志文件将是:
example.cpp,第11行,Func2输入
example.cpp, line 03, Func1 输入
example.cpp,第 06 行,Func1 退出
example.cpp,第17行,Func2退出
我不想像下面这样添加很多日志记录代码
Line 1 : void Fun1()
Line 2 : {
Line 3 : FUNCTION_ENTER;
Line 4 : //do something 1
Line 5 : //do something 2
Line 6 : if (bCheckFail1)
Line 7 : {
Line 8 : FUNCTION_EXIT;
Line 9 : return;
Line 10 : }
Line 11 : //do something 3
Line 12 : if (bCheckFail2)
Line 13 : {
Line 14 : FUNCTION_EXIT;
Line 15 : return;
Line 16 : }
Line 17 : //do something 4
Line 18 : FUNCTION_EXIT;
Line 19 : return;
Line 20 : }
最佳答案
注意:这还不完全正确。仍然没有想出如何为函数的结尾获取正确的行号。
编辑:
经过一些挖掘,我设法接近了,但没有雪茄:
您必须对出现 #line
的行进行硬编码,再加上一(因为它在该行之后开始计数。)
class LogTemporary {
int line;
std::string function;
public:
LogTemporary(int nline, std::string nfunction) : line(nline), function(nfunction) {
#line 13
std::cout<<nline<< " " << nfunction << " enter " << std::endl;
}
~LogTemporary() {
std::cout<<__LINE__+line-13<< " " << function << " exit " << std::endl;
}
};
这是我的结果:
30 Func2 enter
22 Func1 enter
25 Func1 exit
33 Func2 exit
Func2 exit
关闭了 3。但是,其余的都是正确的。
按照建议,您可以使用临时对象。该对象将被限制在函数调用的范围内,因此一旦它死亡(在函数结束时)就会调用析构函数。
#include <iostream>
class LogTemporary {
int line;
std::string function;
public:
LogTemporary(int nline, std::string nfunction) : line(nline), function(nfunction) {
std::cout<<nline<< " " << nfunction << " enter " << std::endl;
}
~LogTemporary() {
std::cout<<line<< " " << function << " exit " << std::endl;
}
};
#define AUTO_LOG_MACRO LogTemporary log_temporary(__LINE__, __FUNCTION__);
void Func1()
{
AUTO_LOG_MACRO;
//do something 1
//do something 2
return;
}
void Func2()
{
AUTO_LOG_MACRO;
//do something 1
//do something 2
Func1();
//do something 1
//do something 2
return;
}
int main() {
Func2();
}
示例输出:
27 Func2 enter
19 Func1 enter
19 Func1 exit
27 Func2 exit
关于c++ - 窗口上 C/C++ 的自动记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20112450/