Если у меня есть библиотека, написанная на С++ 03, и я скомпилирую ее в статическую библиотеку, могу ли я использовать ее в С++ 11? Также возможно обратное (статическая библиотека С++ 11 с С++ 03).
Обновление: Я использую компилятор clang или LLVM
Если у меня есть библиотека, написанная на С++ 03, и я скомпилирую ее в статическую библиотеку, могу ли я использовать ее в С++ 11? Также возможно обратное (статическая библиотека С++ 11 с С++ 03).
Обновление: Я использую компилятор clang или LLVM
Это зависит прежде всего от того, как вы используете стандартную библиотеку С++ в своей библиотеке.
Если вы его вообще не используете, вы вряд ли столкнетесь с какими-либо проблемами.
Если вы используете 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).
Зависит от компилятора. GCC, например, управляет идентификаторами, ABI которых изменился в С++ 11 по-разному в режиме С++ 11. Например, если вы не используете такие вещи, как std::list
, тогда вы в порядке.