2016-06-03 27 views
-2

Ich habe einen Code, der mit GCC 5.3.1 ohne _GLIBCXX_CXX11_ABI erstellt wird. Nun nehme ich an, ich möchte sowohl den alten als auch den neuen std::__cxx11::string im selben Code verwenden. Ist das möglich? Wenn das so ist, wie?Ist es möglich, C++ 11 ABI _und_ sowohl cxx11-style als auch alte-strings zu verwenden?

Hinweise:

  • Ich habe nicht wirklich einen guten Grund, dies zu tun. Ich habe einen nicht so guten Grund, aber lassen Sie uns bitte eine theoretische Frage stellen.
  • Es ist in Ordnung, wenn die C++ 11-Strings nicht std::string genannt werden.
+0

... wollen Sie beide "std :: string" heißen? –

+0

@ T.C .: Ah. Ich verstehe dein Argument. Nehmen wir an, ich bin damit einverstanden, dass die C++ 11-Strings nicht std :: string heißen. – einpoklum

+1

'ext/vstring.h' ist dann dein Freund. –

Antwort

1

Können Sie die alte und die neue string Implementierung im selben Code haben? Nicht genau. Die Almighty Manual Staaten:

ABI Übergang fügt neue Implementierungen von mehreren Komponenten, mit das abi_tag Attribute und den __cxx11 Inline-Namespace die neuen Einheiten von den alten unterscheiden.

  • Verwendung des neuen oder alten ABI kann pro-Übersetzungseinheit mit dem Makro _GLIBCXX_USE_CXX11_ABI ausgewählt werden.

  • Neue String-Implementierung ohne Referenzzählung.

Nun könnte man theoretisch mit -D_GLIBCXX_USE_CXX11_ABI=0 kompilieren und verwenden ext/vstring.h, die Änderung GCC war konformen String-Implementierung vor dem Brechen ABI. Ich wäre nicht überrascht, wenn die Dinge in die Luft gehen würden.

+0

Warte, ist das nicht widersprüchlich? Ich meine, vstring ist die alte Implementierung und '-D_GLIBCXX_USE_CXX11_ABI = 0 'wird mir die alte Implementierung als' std :: string' geben. Oder liege ich falsch? – einpoklum

+0

@einpoklum Nein, copy-on-write ist die alte String-Implementierung, "non-reference-counted" ist die neue (aka 'vstring'). Ich sage, dass es keinen Grund gibt,' vstring' in C + zu verwenden + 11/der neue ABI). –