Почему Qt Creator использует std::___LIBCPP_ABI_VERSION::string вместо std::string, когда я использую «Добавить определение» в xxx.cpp? Что это значит?

Когда я определяю метод, который принимает std::string в файле заголовка и использует функциональность «Add Definition to xxx.cpp» в Qt Creator, он создает определение в .cpp, в котором все параметры std::string используют тип std::___LIBCPP_ABI_VERSION::string.

Обычно я просто удаляю "___LIBCPP_ABI_VERSION::", но что это значит? Почему это происходит и как заставить qt Creator просто использовать std::string по назначению?

Это в ОСХ. Я должен добавить, что в моем файле .pro у меня есть:

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

для использования С++11. Я предполагаю, что это как-то связано с использованием стандартной библиотеки, но я точно не знаю, в чем проблема.


person daj    schedule 10.02.2015    source источник
comment
Независимо от вашей текущей проблемы, вы не должны смешивать libc++ и libstdc++. Это разные библиотеки. Узнайте больше о текущей стандартной библиотеке C++ clang: libcxx.llvm.org/#why   -  person Simon Warta    schedule 11.02.2015


Ответы (1)


Это связано с тем, что вы можете "перенаправлять" типы, и Qt Creator разрешает эти перенаправления по-разному, возможно, не всегда самым желаемым образом.

Предположим, у вас есть 2 типа Foo в Namespace1 и Bar в Namespace2. Теперь вы можете сделать Bar типом Namespace1, чтобы иметь доступ к нему через Namespace1::Bar.

бар.ч

#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 оба аргумента типа находятся в Namespace1, но они перенаправляются по-разному (см. инструкцию using). Для компилятора все то же самое, но Qt Creator по-разному расширяет типы в файл cpp.

foo.cpp

#include "foo.h"

namespace Namespace1 {

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

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

}

В стандартной библиотеке C++ в OS X std::string не реализуется напрямую, а перенаправляется на std::___LIBCPP_ABI_VERSION::string, которая затем реализует функциональность. Для вас, как пользователя, это вообще не должно быть видно, потому что это деталь реализации, которая может измениться в будущем. Вы всегда работаете над std::string. Вы можете и всегда должны заменить тип исходным типом, который вы использовали в заголовке.

person Simon Warta    schedule 11.02.2015
comment
Есть ли что-нибудь, что я могу сделать, чтобы Qt Creator разрешил перенаправление по желанию? - person daj; 12.02.2015
comment
Qt Creator вообще имеет проблемы с пониманием кода. Существует Options/C++/Codemodel, где вы можете каким-то образом переключиться с внутренней модели Qt Creator на модель кода Clang, но это очень экспериментально. Я не знаю подробностей, так как мы тестировали его очень короткое время, потому что он был слишком медленным. Я бы рекомендовал настроить сценарий командной строки, используя find и sed, который заменяет std::___LIBCPP_ABI_VERSION::string. Вы можете использовать собственный скрипт сборки в Qt Creator, чтобы запускать его перед каждой сборкой. - person Simon Warta; 12.02.2015