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

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

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


person NebulaFox    schedule 28.09.2012    source источник
comment
Совместим ли ваш компилятор C++03 и двоичный файл стандартной библиотеки с вашим компилятором C++11 и стандартной библиотекой?   -  person    schedule 28.09.2012
comment
@hvd - точка взята; Я удалил свой предыдущий комментарий. Спасибо.   -  person mah    schedule 28.09.2012
comment
Вы упоминаете компилятор, который используете сейчас, но не стандартную библиотеку. clang можно использовать по крайней мере с GCC libstdc++ и libc++, я не знаю, есть ли другие.   -  person    schedule 28.09.2012
comment
Я думаю, что было бы разумнее использовать libc++   -  person NebulaFox    schedule 28.09.2012
comment
В этом случае я знаю, что некоторые несовместимости, которые могут вызвать проблемы с libstdc++, неприменимы, но я точно не знаю, могут ли быть другие проблемы.   -  person    schedule 28.09.2012


Ответы (2)


В первую очередь это зависит от того, как вы используете стандартную библиотеку 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).

person Richard Smith    schedule 29.09.2012
comment
Нельзя полностью избежать проблем совместимости с ABI, не допуская их в интерфейс. Другое место, где они могут появиться, - это если какой-то другой тип, который появляется в интерфейсе, внутренне хранит объект стандартной библиотеки, несовместимый с ABI. - person bames53; 30.11.2012
comment
Я надеялся, что стандартные типы библиотек не охватывают этот случай, но я отредактирую ответ, если вы считаете, что это неясно. - person Richard Smith; 04.12.2012

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

person Community    schedule 28.09.2012