考虑这段代码。
//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()
{
}
在这种情况下,编译器再次出错多次声明。
有人能解释一下我们在类和全局声明中的静态变量的行为吗?提前致谢。
答案 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;