Выбор ответа Middle Сборка и линковка спрашивают часто обновлено

Функция, определённая в заголовке

Вопрос

В utils.h написано int square(int x) { return x * x; } (без inline), заголовок включён в a.cpp и b.cpp. Что будет?

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

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

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

Коротко

Правильный ответ: Ошибка линковки «multiple definition of square». Каждая единица трансляции получает своё внешнее определение square, и правило одного определения нарушено.

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

  1. Ошибка линковки «multiple definition of square»правильный ответ
  2. Всё соберётся, линковщик возьмёт одну копию
  3. Ошибка компиляции в каждом файле
  4. Неопределённое поведение без диагностики

Разбор

Каждая единица трансляции получает своё внешнее определение square, и правило одного определения нарушено. GNU ld сообщит multiple definition. Лечится словом inline (тогда одинаковые определения разрешены), static или безымянным пространством имён (своя копия на файл), либо выносом определения в .cpp.

  • Одну копию линковщик выбирает только для inline-сущностей и шаблонов.
  • Каждый файл по отдельности корректен, компилятор ошибки не видит.
  • Здесь нарушение диагностируется; без диагностики остаются разные определения inline-функции.

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

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