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

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

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

11

Решение

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

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

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

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

    • Некоторые символы могут изменить значение (например, 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).

15

Другие решения

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

0