Реализация обычной тассировки

190
20 мая 2017, 19:53

Здравствуйте, помогите пожалуйста,укажите на ошибки при реализации тассировки. Не могу понять принцип работы #ifdef , #else и #define.

Реализую класс Trace.h с шаблонным методом для записи. В нем же реализую мои макросы. Подскажите пожалуйста , на том ли я пути стою? Файл TRACE.txt лежит там же что и исполнимый файл.

Итог: ничего не записывает в файл.

Думаю, что ошибка в определении макросов.

Код:

(Trace.h)

#include <iostream>
#include <fstream> 
class Trace
{
public:
    Trace()
    {
        std::ofstream TraceFileWrite("TRACE.txt");
    }
    template <class T>
    void writingData(T object)
    {
          TraceFileWrite << T;
    }
    ~Trace()
    {
    //  TraceFileWrite.close();
    }
};
#ifdef Enabled_Trace 
#define Enabled_Trace(object) writingData(object)
#else 
#define Enabled_Trace(object)
#endif

(Source.cpp)

#include "Trace.h"
#include <iostream>
#include <string>
int main()
{
    int a=7;
    double b=93.09432;
    std::string str("Hello");
    Enabled_Trace(a)
    Enabled_Trace(b)
    Enabled_Trace(str)
    std::cout<<"Hello Trace!"<<std::endl;
    system("pause");
    return 0;
}
Answer 1

Я думаю, вы хотели сделать нечто вроде этого:

#include <iostream>
#include <fstream>
#include <string>

#define Enable_Trace
#if defined(Enable_Trace)
class Trace
{
public:
    static Trace& tracer()
    {
        static Trace t;
        return t;
    }
    template <class T>
    void writingData(const T& object)
    {
          TraceFileWrite << object;
    }
private:
    Trace()
    {
        TraceFileWrite.open("TRACE.txt");
        // Проверки, что открыт
    }
    ~Trace()
    {
        TraceFileWrite.close();
    }
    std::ofstream TraceFileWrite;
};
#define  doTrace(x) { Trace::tracer().writingData(#x" = "); \
    Trace::tracer().writingData((x)); \
    Trace::tracer().writingData("\n"); }
#else
#define doTrace(x)
#endif

int main()
{
    int a=7;
    double b=93.09432;
    std::string str("Hello");
    doTrace(a);
    doTrace(b);
    doTrace(str);
    std::cout<<"Hello Trace!"<<std::endl;
    system("pause");
    return 0;
}

Надеюсь, вы разберетесь, как и что тут работает, и по файлам разнесете. Вкратце - если Enable_Trace определен - есть класс Trace и определен макрос для его использования. Класс - синглтон (файл трассировки единственный).

Добавлю только, что я бы, пожалуй, не затирал файл трассировки, а делал его дописываемым.

READ ALSO
Конвертация std::string в std::wstring

Конвертация std::string в std::wstring

Доброго времени сутокСпособов несколько знаю, вот к примеру:

238
QApplication::postEvent правильно ли?

QApplication::postEvent правильно ли?

Есть класс наследник QWidget, у которого есть виртуальный метод updateStyle()Данный метод должен срабатывать при получение QEvent::StyleChange и один раз при...

279
GCC для MACOS (Macbook Air)

GCC для MACOS (Macbook Air)

Нужно не большое по весу решение, то есть Хсоde не подойдет, для компиляции С++ кода на MacЕсть какие-нибудь идеи?

379
Изменение размера вектора

Изменение размера вектора

Слышал, что если делать в вектор push_back, то если у него не хватает внутреннего буфера, то он увеличивается в 15 раза

347