Как узнать уровень вложенности функции
Придумал интересную задачу.
Она заключается в том, чтобы в правильном виде выводить логи в функциях. Приведу пример:
Этот макрос упростит нам жизнь, он просто выводит какие-то логи в консоль:
#define LOG_INFO(msg)\
std::cout << msg << std::endl
Несколько пустых функций, в которых выводятся какие-то логи
void _A(){
LOG_INFO("The function _A STARTED here");
LOG_INFO("The function _A ENDED here");
}
void _B(){
LOG_INFO("The function _B STARTED here");
_A();
LOG_INFO("The function _B ENDED here");
}
void _C(){
LOG_INFO("The function _C STARTED here");
_B();
LOG_INFO("The function _C ENDED here");
}
int main(){
_C();
}
Вывод будет таким:
The function _C STARTED here
The function _B STARTED here
The function _A STARTED here
The function _A ENDED here
The function _B ENDED here
The function _C ENDED here
А мне хотелось бы, чтобы автоматически, в зависимости от вложенности, перед логами были отступы, например:
The function _C STARTED here
....The function _B STARTED here
........The function _A STARTED here
........The function _A ENDED here
....The function _B ENDED here
The function _C ENDED here
Я не хочу передавать текущий уровень вложенности из функции в функцию, можно это как-то определить иначе?
Ответы (2 шт):
Вот так не хотите?
class Logg
{
public:
Logg(const char * f):f(f)
{
for(int i = 0; i < lvl; ++i) cout << " ";
cout << "The function " << f << " STARTED here\n";
lvl++;
}
~Logg()
{
lvl--;
for(int i = 0; i < lvl; ++i) cout << " ";
cout << "The function " << f << " ENDED here\n";
}
private:
string f;
inline static int lvl = 0;
};
void C()
{
Logg L(__FUNCTION__);
}
void B()
{
Logg L(__FUNCTION__);
C();
}
void A()
{
Logg L(__FUNCTION__);
B();
}
int main(int argc, char * argv[])
{
A();
}
Всё реализовано в библиотеке. Не надо использовать макросы кроме условной компиляции и инклюдов.
https://en.cppreference.com/w/cpp/header/stacktrace https://en.cppreference.com/w/cpp/utility/source_location