c++ - 当我使用 "Add Definition to xxx.cpp"时,为什么 Qt Creator 使用 std::___LIBCPP_ABI_VERSION::string 而不是 std::string ?这是什么意思?

标签 c++ qt c++11 qt-creator std

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

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

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

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

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

最佳答案

这是因为您可以“重定向”类型,而 Qt Creator 会以不同的方式解决此重定向,也许并不总是以最想要的方式。

假设您在 Namespace1 中有 2 个类型 Foo,在 Namespace2 中有 Bar。现在,您可以将 Bar 设为 Namespace1 的类型,以便能够通过 Namespace1::Bar 访问它。

酒吧.h

#pragma once

namespace Namespace2 {

struct Bar
{
};

}

foo.h

#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);
    };
}

在 foo header 中,两个参数都是 Namespace1 中的类型,但它们以不同的方式重定向(请参阅 using 语句)。对于编译器来说,它们都是相同的,但 Qt Creator 将类型以不同的方式扩展到 cpp 文件中。

foo.cpp

#include "foo.h"

namespace Namespace1 {

Foo::Foo(const Namespace2::Bar &bar)
{
}

Foo::Foo(const MyBar &bar)
{
}

}

在 OS X 上的 C++ 标准库中,std::string 并未直接实现,而是重定向到 std::___LIBCPP_ABI_VERSION::string,然后由后者实现功能。对于作为用户的您来说,这根本不应该是可见的,因为它是一个实现细节,将来可能会发生变化。您始终致力于 std::string。您可以并且始终应该将类型替换为 header 中使用的原始类型。

关于c++ - 当我使用 "Add Definition to xxx.cpp"时,为什么 Qt Creator 使用 std::___LIBCPP_ABI_VERSION::string 而不是 std::string ?这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28437778/

相关文章:

c++ - 为所有字符串类型重载模板函数

c++ - 将托管 C++ 从 vs2003 移植到 vs2008 的问题

C++/QT - QFileDialog::getOpenFileName 过滤器 *.xml 禁用名称中包含日文字符的文件

c++ - 将数组转换为变量

c++ - C++ 中的静态和全局变量

c++ - QSqlTableModel 中的附加空行

QT的glBegin没有声明?

c++ - 没有原始指针返回二进制数据的通用方法

c++ - 尝试从文件中读取时出现超出范围错误?

c++ - LNK2001:为 x64 平台构建时无法解析的外部符号