为什么我用"Add Definition to xxx.cpp"的时候Qt Creator用的是std::___LIBCPP_ABI_VERSION::string而不是std::string?这是什么意思?
Why does Qt Creator use std::___LIBCPP_ABI_VERSION::string instead of std::string when I use "Add Definition to xxx.cpp"? What does this mean?
当我定义一个在头文件中采用 std::string
的方法并在 Qt Creator 中使用“Add Definition to xxx.cpp
”功能时,它会在 .cpp 中创建一个定义,其中所有 std::string 参数使用类型 std::___LIBCPP_ABI_VERSION::string
。
通常我只是删除“___LIBCPP_ABI_VERSION::
”,但这是什么意思?为什么会发生这种情况以及如何让 qt creator 按预期简单地使用 std::string?
这是在 OSX。我应该在我的 .pro 文件中添加它:
LIBS += -stdlib=libc++
LIBS += -lstdc++
为了使用 C++11。我猜这与标准库的使用有关,但我不知道到底是什么问题。
这是因为您可以 "redirect" 类型并且 Qt Creator 以不同的方式解析此重定向,也许并不总是以最想要的方式。
假设您在 Namespace1
中有 2 种类型 Foo
,在 Namespace2
中有两种类型 Bar
。现在您可以将 Bar
设为 Namespace1
的类型,以便能够通过 Namespace1::Bar
.
访问它
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.
中使用的原始类型
当我定义一个在头文件中采用 std::string
的方法并在 Qt Creator 中使用“Add Definition to xxx.cpp
”功能时,它会在 .cpp 中创建一个定义,其中所有 std::string 参数使用类型 std::___LIBCPP_ABI_VERSION::string
。
通常我只是删除“___LIBCPP_ABI_VERSION::
”,但这是什么意思?为什么会发生这种情况以及如何让 qt creator 按预期简单地使用 std::string?
这是在 OSX。我应该在我的 .pro 文件中添加它:
LIBS += -stdlib=libc++
LIBS += -lstdc++
为了使用 C++11。我猜这与标准库的使用有关,但我不知道到底是什么问题。
这是因为您可以 "redirect" 类型并且 Qt Creator 以不同的方式解析此重定向,也许并不总是以最想要的方式。
假设您在 Namespace1
中有 2 种类型 Foo
,在 Namespace2
中有两种类型 Bar
。现在您可以将 Bar
设为 Namespace1
的类型,以便能够通过 Namespace1::Bar
.
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.