变量已在 .obj 中定义,但没有循环包含

Variable already defined in .obj, but no circular includes

我知道,SO 上已经有很多类似的问题和解决方案,我阅读了它们,但是其中 none 帮助我解决了我的问题。

我创建了一个 class 用于记录。 这里是Logger.h

#ifndef LOGGER_H
#define LOGGER_H

namespace Logger
{
namespace debug
{

    int Error = 0, OtherNumber;

    class log
    {
    public:     // Methods
        void Save();

    private:    // Members
        static int indentation;
        const std::wstring context;
        int Type, LineNumber;

    public:     // Constructor, Destructor
        log( const std::wstring& context, int LineNumber, int Type );
        ~log();

    };//class log

}//namespace debug

}//namespace Logger

#endif //LOGGER_H

Logger.cpp

#include "stdafx.h"

#include "Logger.h"

namespace Logger
{
namespace debug
{
    log::log( const std::wstring& ctx, int linenr, int type ): context( ctx ), LineNumber( linenr ), Type( type )
    {
        printf("\nLogging start! Context = %ls - Line = %d - Type = %d", context.c_str(), LineNumber, Type );
    }

    log::~log()
    {
        printf( "\nLogging end! Context = %ls - Line = %d - Type = %d", context.c_str(), LineNumber, Type );
        printf( "\nUsing Error here =%d", Error );
    }
    void log::Save()
    {
        FILE *fp = NULL;

        fclose( fp );
        fp = fopen( "mylogfile.log", "a" );
    }

}//namespace debug

}//namespace Logger

然后在 main.h 我有:

#ifndef MYAPP_H
#define MYAPP_H

#include "Logger.h"

#define WIDEN2( x )     L ## x
#define WIDEN( x )      WIDEN2( x )
#define WFILE       WIDEN( __FILE__ )

#define __STR2WSTR( str )   L##str
#define _STR2WSTR(str)  __STR2WSTR(str)
#define WFUNCTION       _STR2WSTR( __FUNCTION__ )

#define DEBUGLOG_START( Type )  Logger::debug::log _debugLog( WFUNCTION, __LINE__, Type );
#define DEBUGLOG_SAVE   { _debugLog.Save(); }

#endif //MYAPP_H

最后在 main.cpp 我有:

#include "Test_UserPart.h"


int _tmain(int argc, _TCHAR* argv[])
{

DEBUGLOG_START( 1 )

Logger::debug::OtherNumber = 10;

_getch();
return 0;
}

当我想编译它时出现错误 error LNK2005: "int Logger::debug::Error" (?Error@debug@Logger@@3HA) already defined in Logger.obj ...MyApp.obj

据我所知,我没有做任何循环包含。但为什么会出现此错误?

谢谢!

您在 header 中定义变量,当 header 包含在多个源文件中时会导致多个定义。相反,在 header:

中声明它们
extern int Error = 0, OtherNumber;
^^^^^^

并在一个源文件中定义它们。或者停止使用全局变量。