Чи може компільована бібліотека C ++ 11 (lib, dll тощо) бути пов’язана зі старими компіляторами C ++?


12

Чи можуть старі компілятори C ++ (наприклад, VS2008 та gcc3.4) зв’язуватися із зовнішніми бібліотеками, написаними на C ++ 11?

Думаю, що на цьому етапі файли C ++ 11 .lib є лише байтовим кодом, і це не повинно заважати старшим компіляторам про те, як він був створений, доки він якимось чином дозволений та може викликатись.

Я розробляю невелику бібліотеку, API якої все ще повинен підтримувати користувачів C ++ 03. Отож, з нетерпінням чекаю, мені цікаво, чи нормально реалізовувати свою бібліотеку за допомогою таких корисних функцій, як тощо std::unique_ptr, чи мені просто дотримуватися boost::?

Відповіді:


10

За умови, що ваша бібліотека використовує лише C ++ 11 для своєї реалізації та не відкриває C ++ 11 засобів або типів публічно, і особливо якщо ви використовуєте статичну зв'язок, то так, це можливо і навіть стандартно.

Розглянемо поширений випадок, коли бібліотека має інтерфейс рівня C (для використання найширшим числом клієнтів), але внутрішньо реалізований у C ++. Клієнти, що посилаються на таку бібліотеку, потребують лише турбуватися про публічний бінарний API (експортовані функції), який ви обмежили, щоб він мав бути встановленим C / C ++ для максимальної сумісності. Програма Java може посилатися на API рівня C, які внутрішньо реалізовані в C ++. Це не означає, що Java повинна "підтримувати C ++". Аналогічно, клієнт C / C ++ старого стилю може посилатися на API рівня C або C ++, який використовує внутрішню версію авангардної версії C ++ libs або будь-якого іншого. Дві окремі речі: те, що потрібно для посилання на інтерфейс бібліотеки, а також те, що сама бібліотека внутрішньо посилається на (або переносить статично).

Ви просто не піддаєте клієнтів вашої бібліотеки залежностями своєї реалізації.

Якщо ви можете статично пов’язати свої залежності (C ++ 11 чи будь-що інше) у вашій бібліотеці, це чисто і незалежно. Бібліотека - це справжнє чорне поле: нічого, крім байт-коду. Але навіть якщо ваша бібліотека посилається на ваші залежності за допомогою "неявної динамічної" зв'язку (не плутати з виразністю LoadLibrary / GetProcAddress та подібними методами на * nix та OS X), старші клієнти все одно повинні мати можливість посилання на цю бібліотеку публічний інтерфейс, навіть якщо вони не змогли зв’язатися з бібліотеками, від яких залежить бібліотека .


1
Чудово! Саме на це я і сподівався. Я не збираюся широко використовувати C ++ 11, але приємно знати, що я міг би виконувати функцію лямбда-дві в моїй прихованій реалізації, коли це зручно. Аналогії C і Java мають сенс. Дякую.
Конафа

4

Здається, ви хочете написати нову бібліотеку для використання іншими, і ви хочете використовувати C + 11 як мову своєї реалізації. Є кілька питань, які слід врахувати:

  • вводячи нову версію C ++, ви запровадите необхідність розгортання нових C ++ бібліотек виконання зі своєю бібліотекою, це гаразд?
  • ви повинні НЕ використовувати новий C + 11 типів в загальнодоступному інтерфейсі, в іншому випадку вони не зможуть назвати.
  • Загалом, вам слід уникати складних типів, таких як унікальний_ptr, навіть векторний тощо. Якщо ви не поширюєте свою бібліотеку як вихідний код, компонування об’єктів у вашій бібліотеці може відрізнятися від компонування в коді клієнта. Дотримуйтесь простих типів, які не мають ризику зміни об'єктів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.