Выбор ответа Middle Сборка и линковка спрашивают часто обновлено
Функция, определённая в заголовке
Вопрос
В utils.h написано int square(int x) { return x * x; } (без inline), заголовок включён в a.cpp и b.cpp. Что будет?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ошибка линковки «multiple definition of square». Каждая единица трансляции получает своё внешнее определение square, и правило одного определения нарушено.
Варианты ответа
- Ошибка линковки «multiple definition of square»правильный ответ
- Всё соберётся, линковщик возьмёт одну копию
- Ошибка компиляции в каждом файле
- Неопределённое поведение без диагностики
Разбор
Каждая единица трансляции получает своё внешнее определение square, и правило одного определения нарушено. GNU ld сообщит multiple definition. Лечится словом inline (тогда одинаковые определения разрешены), static или безымянным пространством имён (своя копия на файл), либо выносом определения в .cpp.
- Одну копию линковщик выбирает только для inline-сущностей и шаблонов.
- Каждый файл по отдельности корректен, компилятор ошибки не видит.
- Здесь нарушение диагностируется; без диагностики остаются разные определения inline-функции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.