编译器如何区分C++中不同类中具有相同名称的静态数据成员?

San*_*San 5 c++ static-members

我最近接到了一个C++访谈,我被问到,编译器如何区分两个不同类中具有相同名称的静态数据成员?

由于所有静态数据变量都存储在数据段中,因此编译器必须通过这种方式跟踪哪些静态数据属于哪个类,尤其是当它们具有相同名称时.

编辑:我回答了名字错误,但他拒绝说名字错误仅在同一类的成员中使用.

Joh*_*itb 12

这些名称在其中包含了类名.clang编译器的一个例子

class A {
  static int i;
};

int A::i = 0;
Run Code Online (Sandbox Code Playgroud)

产量

$ clang++ -cc1 -emit-llvm main1.cpp -o -
; ModuleID = 'main1.cpp'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
target triple = "i386-pc-linux-gnu"

@_ZN1A1iE = global i32 0, align 4
Run Code Online (Sandbox Code Playgroud)

哪里_ZN1A1iE

$ c++filt _ZN1A1iE
A::i
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 6

它是实现定义的,因此没有一种方法可以完成.

虽然名称错误很常见.