当我使用“Add definition to xxx.cpp”时,为什么Qt Creator使用std :: ___ LIBCPP_ABI_VERSION :: string而不是std :: string?这是什么意思?

时间:2015-02-10 17:16:28

标签: c++ qt c++11 qt-creator c++-standard-library

当我定义一个方法,该方法在头文件中使用std::string并使用" Add Definition to xxx.cpp"在Qt Creator中,它在.cpp中创建一个定义,其中所有std :: string参数都使用类型std::___LIBCPP_ABI_VERSION::string

通常我只是删除" ___LIBCPP_ABI_VERSION::",但这是什么意思?为什么会发生这种情况?如何让qt创建者只是按预期使用std :: string?

这是在OSX中。我应该在我的.pro文件中添加:

LIBS += -stdlib=libc++
LIBS += -lstdc++

为了使用C ++ 11。我猜这与标准库的使用有关,但我不确切地知道问题是什么。

1 个答案:

答案 0 :(得分:2)

这是因为你可以"重定向"类型和Qt Creator以不同的方式解析这种重定向,也许并不总是以最想要的方式。

假设您在Foo中有Namespace1BarNamespace2中有Bar。现在,您可以Namespace1 Namespace1::Bar种类#pragma once namespace Namespace2 { struct Bar { }; } ,以便能够通过#pragma once #include "bar.h" namespace Namespace1 { using MyBar = Namespace2::Bar; // i.e. Namespace1::MyBar using Namespace2::Bar; // i.e. Namespace1::Bar class Foo { public: Foo(const Bar &bar); Foo(const MyBar &bar); }; } 访问它。

bar.h

Namespace1

foo.h中

using

在foo标头中,两个参数都是cpp中的类型,但它们以不同的方式重定向(请参阅#include "foo.h" namespace Namespace1 { Foo::Foo(const Namespace2::Bar &bar) { } Foo::Foo(const MyBar &bar) { } } 语句)。对于编译器来说它是完全相同的,但是Qt Creator将类型扩展为std::string文件。

Foo.cpp中

std::___LIBCPP_ABI_VERSION::string

在OS X上的C ++标准库中,std::string未直接实现,而是重定向到{{1}},然后{{1}}实现该功能。作为用户,您根本不应该看到它,因为它是一个实现细节,将来可能会发生变化。你一直在{{1}}工作。您可以并且始终应该使用标头中使用的原始类型替换类型。