Если у меня есть библиотека, написанная на C++03, и я компилирую ее в статическую библиотеку, могу ли я использовать ее в C++11? Также возможно обратное (статическая библиотека С++ 11 с С++ 03).
Обновление: Я использую компилятор clang или LLVM.
Если у меня есть библиотека, написанная на C++03, и я компилирую ее в статическую библиотеку, могу ли я использовать ее в C++11? Также возможно обратное (статическая библиотека С++ 11 с С++ 03).
Обновление: Я использую компилятор clang или LLVM.
В первую очередь это зависит от того, как вы используете стандартную библиотеку C++ в своей библиотеке.
Если вы им вообще не пользуетесь, то вряд ли столкнетесь с какими-то проблемами.
Если вы используете libstdc++
, вы можете столкнуться с некоторыми проблемами:
Передача стандартных библиотечных объектов в вашу библиотеку и из нее не всегда будет работать (например, std::list
в режиме C++11 в конечном итоге будет больше, чем в настоящее время в режиме C++98, потому что он увеличивает член данных size
, а представление std::string
меняется на представление без подсчета ссылок). У разработчиков g++ есть план ввести форму пометки символов, чтобы обнаруживать эти проблемы во время компоновки, поэтому вы получите ошибки, если столкнетесь с любым из проблемных случаев, но это еще не реализовано в g++ и, возможно, никогда не будет реализовано в лязг. Вы можете избежать этой проблемы, убедившись, что интерфейс вашей библиотеки не использует стандартные типы библиотек.
Некоторые символы могут изменить значение (например, std::complex::real
и std::complex::imag
возвращают ссылки в режиме C++98, но возвращают по значению в режиме C++11 из-за недостатка constexpr
). Если вы связываете вместе (неоптимизированный) код, используя формы C++98 и C++11, вы можете выбрать неправильную реализацию со странными результатами во время выполнения.
Если вы используете libc++
, проблем быть не должно. libc++
был разработан для двоичной совместимости между режимами C++98 и C++11.
Если вы используете libc++
в библиотеке и libstdc++
в программе, или наоборот, то большинство несовместимостей будет обнаружено во время компоновки. (libc++
использует inline namespace
внутри namespace std
, содержащего большинство его символов, что приводит к несовместимости во время компоновки, если вы пытаетесь передать типы libstdc++
через границу). Однако у вас все еще могут возникнуть проблемы во время выполнения, если интерфейс вашей библиотеки косвенно содержит стандартные библиотечные типы (например, если он использует struct
, член которого имеет стандартный библиотечный тип). Для типов, которые libc++
не поддерживает версию, он стремится быть двоично-совместимым с libstdc++
(как в режимах C++98, так и в C++11).
Зависит от компилятора. GCC, например, искажает идентификаторы, чей ABI изменился в C++11, по-разному в режиме C++11. Так, например, если вы не используете такие вещи, как std::list
, то все в порядке.