有人可以提出建议吗?
如果C ++中的const
默认为内部链接,为什么我在下面的代码中会出现多个定义错误?
首先,文件dem.h
:
#ifndef _DEM_H_
#define _DEM_H_
class Dem {
public:
static const int i;
};
const int Dem::i = 10;
#endif
他们imp1.cpp
:
#include "dem.h"
#include <iostream>
using namespace std;
extern int foo();
int main() {
cout << foo() << endl;
}
和imp2.cpp
:
#include "dem.h"
int foo() {
return Dem::i ;
}
我使用以下命令和结果进行编译:
$ g++ imp1.cpp imp2.cpp
/tmp/ccmGt0OY.o:imp2.cpp:(.rdata+0x0): multiple definition of `Dem::i'
/tmp/cc5sN7dz.o:imp1.cpp:(.rdata+0x0): first defined here
collect2: ld returned 1 exit status
答案 0 :(得分:3)
来自C ++ 11 [basic.link]
,第5段:
此外,还包括成员函数,静态数据成员,类范围的命名类或枚举,或类范围typedef声明中定义的未命名类或枚举,以便类或枚举具有用于链接目的的typedef名称(7.1.3),如果类的名称具有外部链接,则具有外部链接。
因为您的类具有外部链接,所以您的静态数据成员也是如此。
答案 1 :(得分:0)
它对编译单元的静态。您正在分两步编译 - 首先是impl1.cpp,然后是impl2.cpp - 并且在每个单元中,编译器实例化静态数据成员。当链接器尝试将两个关联的目标文件链接在一起时,它会看到同一符号的两个不同定义,因此您会得到多个定义错误。