5
przypadek testowy następująco:Dlaczego g ++ generuje dwa konstruktory z różnymi manglingami nazw?
// test.cpp
class X {
public:
X();
};
X::X() { }
void foo() {
X x;
}
skompilować i czytać symbole w pliku obiektu tak:
[[email protected] tmp]# g++ -c test.cpp
[[email protected] tmp]# readelf -s -W test.o
Symbol stół '.symtab' zawiera 12 pozycje:
Num: Wartość Rozmiar Typ Powiąż Vis Ndx Nazwa
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.cpp
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC2Ev => X::X()
9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND __gxx_personality_v0
10: 0000000000000000 10 FUNC GLOBAL DEFAULT 1 _ZN1XC1Ev => X::X()
11: 000000000000000a 22 FUNC GLOBAL DEFAULT 1 _Z3foov
[[email protected] tmp]# c++filt _ZN1XC1Ev
X::X()
[[email protected] tmp]# c++filt _ZN1XC2Ev
X::X()
Dlaczego g ++ wygenerować dwa konstruktory o różnych nazwach manglingów (_ZN1XC1Ev
i _ZN1XC2Ev
)?
Niektóre kompilatory generują dwa konstruktory, jeden zadzwonić z programów użytkownika i jeden zadzwonić kiedy jest stosowany jako baza klasa innego obiektu, ponieważ czasami istnieją pewne różnice w tym, co należy zrobić. Jestem trochę niejasna w szczegółach i nie wiem, czy tak jest w tym przypadku, więc może to być całkowicie błędne, a więc to komentarz nie jest odpowiedzią :) – jcoder