Выбор ответа Middle Сборка и линковка обновлено

extern "C"

Вопрос

Зачем объявлять функцию как extern "C" int compute(int);?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Чтобы отключить name mangling и вызывать функцию из C или через dlsym. C++ кодирует в имени символа пространство имён и типы параметров (Z7computei), на этом держится перегрузка.

Варианты ответа

  1. Чтобы тело функции компилировалось компилятором C, а не компилятором C++
  2. Чтобы отключить name mangling и вызывать функцию из C или через dlsymправильный ответ
  3. Чтобы функция была видна только в текущем файле, как при static
  4. Чтобы запретить исключения в функции, как при пометке noexcept

Разбор

C++ кодирует в имени символа пространство имён и типы параметров (_Z7computei), на этом держится перегрузка. C-код и dlsym("compute") ищут простое имя. extern "C" задаёт C-связывание: символ будет compute, перегружать такие функции нельзя.

  • Тело всё равно компилируется как C++.
  • Видимость в файле это static или безымянное пространство имён.
  • Исключения extern "C" не запрещает (хотя бросать их в C-код нельзя).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.