Как узнать уровень вложенности функции

Придумал интересную задачу.

Она заключается в том, чтобы в правильном виде выводить логи в функциях. Приведу пример:

Этот макрос упростит нам жизнь, он просто выводит какие-то логи в консоль:

#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 шт):

Автор решения: Harry

Вот так не хотите?

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();
}
→ Ссылка
Автор решения: karmik

Всё реализовано в библиотеке. Не надо использовать макросы кроме условной компиляции и инклюдов.

https://en.cppreference.com/w/cpp/header/stacktrace https://en.cppreference.com/w/cpp/utility/source_location

→ Ссылка