2016-07-15 24 views
4

での非互換性は、簡単なコードを取る:abi_tab ::文字列():打ち鳴らす++と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();} 

のは、シンボル名を見てみましょうたより:

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

私たちは、このような記号が表示されます。

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 

関数 'foo'にタグが付けられています。これは完全に正しいです。その名前ではABIの兆候はありませんが、ABIに依存するstd :: stringを使用しています。

機能 'bar'はタグ付けされていません。また、その署名がstd :: __ cxx11名前空間を介してABIの直接参照を持つこともOKです。

しかし、 '演算子std :: string'にもタグが付けられています。どうして?その名前にはすでに 'std :: __ cxx11'があります。

'std :: string :: empty'にはタグが付けられていません。 - 私のための論理。

私たちが打ち鳴らすと同じ手順を繰り返した場合++(3.9、SVNからトランク)我々は少し別の画像が表示されます。

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 

すべてが同じですが、「オペレータのstd ::文字列」です。

g ++またはclang ++は誰ですか?私はclangの行動がより論理的だと思う。

しかし、すでにLinuxのさまざまなディストリビューションにg ++でコンパイルされたライブラリがあります。だから変わってしまうのはおそらくそれです。

私はllvmでこのバグを提出しました。しかし、疑問はまだあります。それはclangまたはgccバグですか?

+0

好奇心から尋ねると、どうしてあなたにとって重要なのでしょうか? – Arunmu

+0

私はclangで自分のプロジェクトをコンパイルできないので、私にとって重要です。gccだけです。 –

答えて

1

ABIタグ付けは、必要に応じてエミュレートするGCC機能であり、GCCは標準的なリファレンスです。

0

これは奇妙です。 https://reviews.llvm.org/D18035のclang 3.8は私のために正しく動作しました。このパッチは3.9でメインライン化されましたが、もはや機能しません。私は説明を見つけることができません。

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

また、clang3.8は '__cxx11'を追加するようですが、clang5.0.0は追加しません – dashesy

0

打ち鳴らす4.0とGCC 7.2は現在、同じマングルされたシンボルを生成します。

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 

GCCでマングリングのバグがあったようです。

関連する問題