Как отслеживать вызовы MFC Serialize с помощью макросов - PullRequest
0 голосов
/ 22 августа 2011

У меня есть приложение MFC, которое записывает огромную иерархию объектов на диск. Чтобы разобраться в том, что пишется, я подумал о регистрации всех обращений к архиву << через вставку потока и метод .write, заменив их макросами </p>

#pragma once
#ifndef LOGMAGIC
#define LOGMAGIC

    class LogTab
    {
    public:
        static int LogIndentCount;
        LogTab()
        {
            LogIndentCount++;
        }

        ~LogTab()
        {
            LogIndentCount--;
        }
    };

    #define ARINSERT(AR,OBJ) TRACE( "%*s %s\n", LogTab::LogIndentCount, #OBJ); AR << OBJ;
    #define ARWRITE(AR,OBJ,SIZE) TRACE("%*s %s\n", LogTab::LogIndentCount, #OBJ); AR.write(OBJ, SIZE);
#endif

Итак, я создал приведенный выше фрагмент кода и поместил его в stdafx.h, но я получаю следующую ошибку:

Ошибка 1, ошибка LNK2001: неразрешенный внешний символ "public: static int LogTab :: LogIndentCount "(? LogIndentCount @ LogTab @@ 2HA)

Что я делаю не так? Есть ли лучший способ добиться того, что я делаю?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Вы должны определить LogTab::LogIndentCount в любом из файлов .cpp как

#include"LogTab.h"
//...
int LogTab::LogIndentCount = 0;

[В качестве примечания: если это многопоточная система, которая использует class, то вы можете подумать о том, чтобы сделать LogIndentCount синхронизированным (поточно-безопасным)] *

0 голосов
/ 22 августа 2011

Статическая переменная должна быть явно инициализирована.

...