静态变量链接错误,C ++

时间:2015-04-26 15:30:22

标签: c++ static global-variables linkage

考虑这段代码。

//header.h
int x;

//otherSource.cpp
#include "header.h"

//main.cpp
#include "header.h"
...
int main()
{

}

在这种情况下,编译器错误地使用了该消息。 "致命错误LNK1169:找到一个或多个多重定义的符号"

但是当我在x之前添加静态时,它会编译而没有错误。

这是第二种情况。

//header.h

class A
{
public:
    void f(){}
    static int a;
};

int A::a = 0;

/otherSource.cpp
#include "header.h"

//main.cpp
#include "header.h"
...
int main()
{

}

在这种情况下,编译器再次出错多次声明。

有人能解释一下我们在类和全局声明中的静态变量的行为吗?提前致谢。

2 个答案:

答案 0 :(得分:2)

静态成员变量的问题在于您在头文件中出现了定义。如果您#include多个源文件中的文件,则您有多个静态成员变量的定义。

要解决此问题,头文件应仅包含以下内容:

#ifndef HEADER_H
#define HEADER_H
// In the header file
class A
{
public:
    void f(){}
    static int a;
};
#endif

静态变量a的定义应该在一个中,并且只能在一个模块中。显而易见的地方在于main.cpp

#include "header.h"
int A::a = 0;  // defined here
int main()
{
}

答案 1 :(得分:0)

x中将extern声明为header.h,告诉编译器将在其他地方定义x

extern int x;

然后在您认为最合适的源文件中定义x 一次
例如,在otherSource.cpp

int x = some_initial_value;