C++中const的内部链接,但我得到了重复的符号

Internal linkage for const in C++, yet I get duplicate symbols

本文关键字:符号 const 内部 链接 C++      更新时间:2023-10-16

有人能提供建议吗?

如果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

来自C++11 [basic.link],第5段:

此外,成员函数、静态数据成员、类作用域的命名类或枚举,或在类作用域typedef声明中定义的未命名类或列举,使得类或枚举具有用于链接目的的typedef名称(7.1.3),如果类的名称具有外部链接,则具有外部链接。

因为类具有外部链接,所以静态数据成员也具有外部链接。

它对编译单元是静态的。编译分为两个步骤——首先是impl1.cpp,然后是impl2.cpp——在每个单元中,编译器都实例化静态数据成员。当链接器尝试将两个关联的对象文件链接在一起时,它会看到同一符号的两个不同定义,因此会出现多定义错误。