Подтвердить что ты не робот

Библиотека С++ 03 с исходным кодом С++ 11

Если у меня есть библиотека, написанная на С++ 03, и я скомпилирую ее в статическую библиотеку, могу ли я использовать ее в С++ 11? Также возможно обратное (статическая библиотека С++ 11 с С++ 03).

Обновление: Я использую компилятор clang или LLVM

4b9b3361

Ответ 1

Это зависит прежде всего от того, как вы используете стандартную библиотеку С++ в своей библиотеке.

  • Если вы его вообще не используете, вы вряд ли столкнетесь с какими-либо проблемами.

  • Если вы используете libstdc++, вы можете столкнуться с некоторыми проблемами:

    • Передача стандартных объектов библиотеки в вашу библиотеку и из нее не всегда будет работать (например, std::list в режиме С++ 11 в конечном итоге будет больше, чем в настоящее время в режиме С++ 98, потому что это растущий член данных size, а представление std::string меняется на подсчет, не содержащий ссылок). Разработчики g++ планируют внедрить форму опознавания символов, чтобы поймать эти проблемы во время связи, поэтому вы получите ошибки, если попадете в любой из проблемных случаев, но это еще не реализовано в g++ и никогда не может быть реализовано в Clang. Вы можете избежать этой проблемы, гарантируя, что ваш интерфейс библиотеки не включает стандартные типы библиотек.

    • Некоторые символы могут изменять значение (например, std::complex::real и std::complex::imag возвращать ссылки в режиме С++ 98, но возвращать значение в режиме С++ 11 из-за недостатка constexpr), Если вы связываете (неоптимизированный) код с использованием как форм С++ 98, так и С++ 11, возможно, вы выбрали неправильную реализацию со странными результатами во время выполнения.

  • Если вы используете libc++, вы не должны видеть никаких проблем. libc++ был разработан как двоично-совместимый между режимами С++ 98 и С++ 11.

  • Если вы используете libc++ в библиотеке и libstdc++ в программе, или наоборот, то большинство несовместимостей будет обнаружено во время соединения. (libc++ использует inline namespace внутри namespace std, содержащий большую часть своих символов, что приводит к несовместимости времени соединения, если вы пытаетесь передать типы libstdc++ через границу). Тем не менее, вы все еще можете столкнуться с проблемами времени выполнения, если ваш интерфейс библиотеки косвенно содержит стандартные типы библиотек (например, если он использует struct, который имеет стандартный тип библиотеки в качестве члена). Для типов, которые libc++ не поддерживает версию, он должен быть двоично-совместимым с libstdc++ (как в режимах С++ 98, так и в С++ 11).

Ответ 2

Зависит от компилятора. GCC, например, управляет идентификаторами, ABI которых изменился в С++ 11 по-разному в режиме С++ 11. Например, если вы не используете такие вещи, как std::list, тогда вы в порядке.