Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建全局变量会导致链接器错误_C++_Mfc_Linker_Compiler Errors_Global Variables - Fatal编程技术网

C++ 创建全局变量会导致链接器错误

C++ 创建全局变量会导致链接器错误,c++,mfc,linker,compiler-errors,global-variables,C++,Mfc,Linker,Compiler Errors,Global Variables,我有一个MFC应用程序AVT_testapp,在头文件(AVT_testappDlg.h)中,我试图在所有函数、类等之外创建一个变量,以使其全局化。无论何时我尝试这样做(比如我尝试intx=7),我都会得到错误: 1>AVT_testappDlg.obj : error LNK2005: "int x" (?x@@3HA) already defined in AVT_testapp.obj 1>..\..\bin\x64\Debug\AVT_testapp.exe : f

我有一个MFC应用程序AVT_testapp,在头文件(AVT_testappDlg.h)中,我试图在所有函数、类等之外创建一个变量,以使其全局化。无论何时我尝试这样做(比如我尝试
intx=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#U 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
#pragma一次
#包括“../../src/CoreUtils/nierr.h”
#包括“.\..\src\CoreUtils\StringHelpers.h”//includes windows.h
#包括“afxwin.h”
#包括“afxcmn.h”
#包括“IFrameObserver.h”
#包括“c:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\GdiPlusHeaders.h”
//#包括
//#包括
int x=7;
使用名称空间AVT::VmbAPI;
//////////////////////////////////////////////////////////////////////////
//////////MyObserver类///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
类MyObserver:public IFrameObserver
{
私人:
MyObserver(MyObserver&);
MyObserver&运算符=(const MyObserver&);
公众:
VmbUchar_t*图像数据;
//...
//...
//...
//...
//相关内容到此为止
您不能在标题中定义命名空间级别的变量。一般来说,最好不要使用全局变量,但如果需要,您应该只在标题中提供声明,并在单个.cpp中提供定义:

//header
extern int i;

//cpp
int i;

代码的问题与头保护无关。头保护可确保头在每个翻译单元中只被解析一次。缺少头保护会导致编译器错误,例如,编译器在预处理后在同一翻译单元中多次看到定义的类。在您的情况下,错误是链接器e错误LNK2005,这意味着在多个翻译单元中定义了相同的符号(在您的案例中,每个翻译单元包括定义的标题)。

如果全局变量不是
const
(*),则不能将其放入标题文件中并将其包含在多个翻译单元中(即
.cpp
文件)。否则,您的程序中会出现同一符号的多个定义,违反了ODR一个定义规则,请参见C++11标准第3.2段),链接器会对此提出投诉

您应该在共享标头中使用
extern
修饰符,仅提供变量声明:

extern int var;
然后,在一个
.cpp
文件中,可以为其提供定义:

int var;

(*)
const
默认情况下,全局变量具有内部链接,因此每个翻译单元最终将拥有它的私有副本,并且不会出现多个定义。

如果您坚持拥有全局变量,至少将其放在命名空间中,以避免与其他模块发生冲突

namespace globals
{
  extern int x;
}
然后在.cpp文件中定义它

int globals::x = 0;

它还更清楚地表明它是一个全局变量。

int i=7;
更改为
extern int i;
并没有摆脱errors@xcdemon05你重建了所有受影响的.cpp文件了吗?你也收到了同样的错误吗?对不起,我不小心在最后一个之后删除了我的评论,但是是的,我修复了它