创建全局变量会导致连接错误(creating global variables causes lin

2019-07-19 19:37发布

我有一个MFC应用程序AVT_testapp,并在头文件(AVT_testappDlg.h)我想,以使其全球创建的所有功能,类等变量外。 每当我尝试这样做,但(我说试试int x = 7 ),我得到的错误:

1>AVT_testappDlg.obj : error LNK2005: "int x" (?x@@3HA) already defined in 
    AVT_testapp.obj
1>..\..\bin\x64\Debug\AVT_testapp.exe : fatal error LNK1169: one or more 
    multiply defined symbols found

我已经在谷歌找到的一切说“只需要添加页眉卫士”。 AVT_testappDlg拥有6#包括的,他们每个人都有标题警卫。

还有什么可以创建全局变量时引起这些错误?

编辑:这是我的头文件的开头,

#pragma once

#include "../../src/CoreUtils/nierr.h"
#include "..\..\src\CoreUtils\StringHelpers.h" //includes windows.h
#include "afxwin.h"
#include "afxcmn.h"
#include "IFrameObserver.h"
#include "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\GdiPlusHeaders.h"
//#include <fstream>
//#include <windows.h>

int x = 7;

using namespace AVT::VmbAPI;


//////////////////////////////////////////////////////////////////////////
//////////  MyObserver class   ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class MyObserver : public IFrameObserver
{
private:
    MyObserver( MyObserver& );

    MyObserver& operator=( const MyObserver& );    

public:

    VmbUchar_t* imageData;

            //...
            //...
            //...
            //...

//that's the end of the relevant stuff

Answer 1:

你不能在一个命名空间标题级别定义变量。 一般而言,最好不要有全局变量,但如果你需要,你应该只提供在头的声明 ,并在一个单一的.cpp的定义:

//header
extern int i;

//cpp
int i;

与你的代码的问题是不相关的头警卫。 头防护确保报头在每个转换单元解析只有一次。 缺乏头警卫导致编译器错误,编译器看到其中,比方说一个类,预处理后在相同的转换单元中定义多次。 在您的情况下,误差是接头错误LNK2005,并且它意味着同样的符号在多个翻译单位定义(在每种翻译单元,其包括与所述定义的标题的情况下)。



Answer 2:

如果全局变量不是const (*),你不能把它放在一个头文件并将其包含在多个翻译单元(即.cpp文件)。 否则,你最终会在你的程序中相同符号的多个定义,违反ODR( 一个定义规则 ,请参见C ++ 11标准第3.2)和链接器会抱怨说。

您应该使用extern修饰符共享头只提供您的变量声明:

extern int var;

然后,在一个单独 .cpp文件,你可以为它提供一个定义:

int var;

(*) const全局变量的默认设置为内部联动,使每个翻译单元最终将不得不它的专用副本,并没有多重定义将发生。



Answer 3:

如果你坚持有一个全局变量,至少把它放在一个命名空间,避免与其他模块的碰撞

namespace globals
{
  extern int x;
}

然后在.cpp文件中定义它。

int globals::x = 0;

这也使得它更清楚,这是一个全局变量。



文章来源: creating global variables causes linker error