2015-09-23 18 views
5

Quando compilato, questo:Troppi simboli costruttore

template <typename T> 
struct ConstArray { 
///MEMBERS 
    T* data_; 
    T* end_; 

///Constructors 
    ConstArray(T* data, T* end) : data_(data), end_(end) {} 
}; 

template struct ConstArray<const char>; 

mi dà (nm -C *.o):

0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*) 
0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*) 
0000000000000000 n ConstArray<char const>::ConstArray(char const*, char const*) 

mi sembra di ottenere tre simboli (2 W + 1 n (non so cosa questo è)) per ogni costruttore che definisco. Le funzioni sembrano darmi solo una come previsto. Qualcuno potrebbe spiegare perché questo è o mi indica una spiegazione?

+7

sembra rilevante: http://stackoverflow.com/questions/6921295/dual-emission-of-constructor-symbols – Michael

+0

YEPP, appena trovato https://www.google.com/search?q=multiple+constructors + generato e c'è stata un'altra grande risposta da qualche parte, non so proprio quali parole di ricerca usare. –

+0

@ Michael Grazie mille. Questa domanda è un duplicato fino al simbolo n non spiegato. – PSkocik

risposta

0

Forse riesco a capire perché questo simbolo appare nell'output nm, ma non posso dire se dovrebbe/non dovrebbe esserci e cosa significa esattamente n. Forse se qualcuno ha familiarità con questo, può inviare una risposta completa.

Se si effettua objdump -t ./obj.o è possibile visualizzare una tabella dei simboli. Tranne 2 costruttori e molti altri simboli vedo

00000000 l  .group 00000000 _ZN10ConstArrayIKcEC5EPS0_S2_ 

lì. Il flag è solo l che significa che è locale e non di debug, quindi lo vedo nell'output nm come terzo simbolo.

Se faccio nm -g ./obj.o di vedere i simboli solo esternato, vedo solo 2 W costruttori e quando lo faccio nm -a ./obj.o vedo tutti i simboli e anche segnato in objdump -x come debug. E vedo anche alcuni simboli di debug che sono n -flagged nell'output nm -a.

Quindi non so che cosa significa n, ma il terzo simbolo è in qualche modo correlato alla sezione .group del file elf. Quale è responsabile del raggruppamento dei simboli insieme.