Автоматический регистратор для C / C ++ в окне

0

Я ищу решение, которое может автоматически выводить журнал с минимальным кодом журнала. Мне нужно записать номер строки, где функция входит и выходит.

Например: в файле 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 :   }
  • 0
    Если это все, что вам нужно, просто напишите объект, который входит в ctor и dtor. Используйте __LINE__ , __FILE__ и __FUNC__
  • 0
    Как получить строку кода в этом объекте журнала уничтожения?
Показать ещё 5 комментариев
Теги:
logging

1 ответ

2

Примечание. Это еще не совсем правильно. Все еще не выяснили, как получить правильный номер строки для конца функции.

Изменить:

После некоторого рытья мне удалось приблизиться, но сигары не было:

Вам нужно жестко закодировать строку, в которой появляется строка #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 
  • 0
    Спасибо за Ваш ответ. Но номер строки выхода неправильный, это строка ввода, а не строка выхода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню