Я ищу решение, которое может автоматически выводить журнал с минимальным кодом журнала. Мне нужно записать номер строки, где функция входит и выходит.
Например: в файле 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 enter
example.cpp, строка 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
__LINE__
,__FILE__
и__FUNC__