Подтвердить что ты не робот

Как работает "extern С++"?

Я прыгнул в winnt.h, и я узнал код следующим образом:

extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

Я хотел бы задать следующие вопросы:

  • Как работает extern "C++"?
  • - это переносимый среди GCC и Clang?
  • Можно ли экспортировать все шаблоны с помощью этого синтаксиса?

В вопросе 3 я имею в виду, что я могу отделить declearation и определение шаблонов, а затем сгенерировать динамическую ссылку для шаблона без фактической реализации, используя этот трюк?

4b9b3361

Ответ 1

Ну, extern "C++", конечно, не будет работать в C (хотя некоторые компиляторы могут поддерживать его как расширение). Поэтому имеет смысл использовать его в С++.

Это потому, что в случае множественных вложенных спецификаторов внешней ссылки, самый внутренний действует. Поэтому, если у вас есть файл заголовка, окруженный extern "C", вы можете использовать extern "C++" для временного выхода из него и объявить что-то с С++-связью.

Это имеет смысл, если вы хотите предоставить общий интерфейс C для библиотеки С++, но вы также хотите предоставить вспомогательные биты С++ для людей, которые действительно используют его на С++. Таким образом, вы разместили бы #ifdef __cplusplus \ extern "C" { \ #endif вокруг заголовка в целом, а затем вы ifdef-в этих битах с extern "C++", чтобы вернуться к связыванию с С++.

Ответ 2

  • Он работает, заставляя компилятор использовать ссылку на С++, когда окружающий код использует C-ссылку по умолчанию (например, вы включаете winnt.h в программу C).
  • Да, он должен быть портативным.
  • Да, они могут. Существует не так много пользы для "extern" С++ "в программах на С++, потому что связь является" С++" в любом случае. Имеет смысл использовать "extern" С++ "", только если есть хороший шанс, что ваш код на С++ будет включен в код C.