2016-07-15 15 views
4

Nehmen einfachen Code:abi_tab auf Operator std :: string(): Inkompatibilitäten in Klirren ++ und g ++

#include <string> 

class C{ 
public: 
    operator std::string()const; 
}; 

C c; 

std::string foo(){return c;} 


bool bar(std::string const&s){return s.empty();} 

als die bei Symbolnamen lassen aussehen:

g++ -std=c++11 -c sample.cpp 
nm -C sample.o 

Wir werden solche Symbole sehen:

bar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 
foo[abi:cxx11]() 
C::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >[abi:cxx11]() const 
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const 

Funktion 'foo' ist markiert - Es ist vollkommen richtig. In seinem Namen gibt es kein Zeichen von ABI, aber es verwendet std :: string, das von ABI abhängig ist.

Funktion 'bar' ist nicht markiert. Und es ist auch OK, da seine Unterschrift direkten Bezug auf ABI über den Namespace std :: __ cxx11 hat.

Aber 'operator std :: string' ist auch markiert. Warum? Es hat bereits 'std :: __ cxx11' in seinem Namen.

Und 'std :: string :: empty' ist nicht markiert. - Logisch für mich.

Wenn wir dieselben Schritte mit Klirren ++ (3.9, Stamm aus dem SVN) wiederholen werden wir etwas anderes Bild sehen:

bar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 
foo[abi:cxx11]() 
C::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const 
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const 

Alles ist gleich, aber ‚Betreiber std :: string‘.

Wer ist hier richtig g ++ oder clang ++? Ich denke, das Klängen ist logischer.

Allerdings haben wir bereits einige Bibliotheken mit g ++ in verschiedenen Linux-Distributionen kompiliert. Es ist also wahrscheinlich, dass der Klang verändert wird.

Ich habe diesen Fehler in llvm eingereicht. Aber immer noch Zweifel - es ist clang oder gcc bug?

+0

Frage nur aus Neugier, warum ist es dir wichtig? – Arunmu

+0

Das ist wichtig für mich, da ich mein Projekt mit clang nicht kompilieren kann, nur gcc. –

Antwort

1

ABI-Tagging ist ein GCC-Feature, das nur aus der Notwendigkeit emuliert wird. GCC ist die kanonische Referenz.

0

Es ist seltsam. clang 3.8 mit https://reviews.llvm.org/D18035 funktionierte richtig für mich. Dieser Patch wurde in 3.9 ausgeführt, funktioniert aber nicht mehr. Ich kann keine Erklärung finden.

undefined reference to `libconfig::Setting::operator std::__cxx11::basic_string, std::allocator >() const
+0

Auch sieht es so aus, dass clang3.8 '__cxx11' hinzufügt, aber clang5.0.0 nicht – dashesy

0

Klirren 4.0 und GCC 7.2 produzieren jetzt die gleichen verstümmelte Symbole:

bar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 
foo[abi:cxx11]() 
C::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const 

Es scheint ein Mangeln Fehler in GCC da war.

Verwandte Themen