Какова цель __cxa_pure_virtual?
-
06-09-2019 - |
Вопрос
При компиляции с помощью avr-gcc я столкнулся с такими ошибками компоновщика, как:
undefined reference to `__cxa_pure_virtual'
Я нашел этот документ в котором говорится:
А
__cxa_pure_virtual
function — это обработчик ошибок, который вызывается при вызове чистой виртуальной функции.Если вы пишете приложение на C++, имеющее чисто виртуальные функции, вы должны предоставить свои собственные
__cxa_pure_virtual
функция обработки ошибок.Например:
extern "C" void __cxa_pure_virtual() { while (1); }
Предложенное определение этой функции исправляет ошибки, но я хотел бы знать:
- какова цель этой функции,
- почему мне нужно определить это самому и
- почему допустимо закодировать его как бесконечный цикл?
Решение
Если где-то во время выполнения вашей программы создается объект с незаполненным указателем виртуальной функции, и при вызове соответствующей функции вы будете вызывать «чистую виртуальную функцию».
Описываемый вами обработчик должен быть определен в библиотеках по умолчанию, входящих в состав вашей среды разработки.Если вы пропустите библиотеки по умолчанию, вы обнаружите, что этот обработчик не определен:компоновщик видит объявление, но не определение.Вот тогда вам и нужно предоставить свою собственную версию.
Бесконечный цикл приемлем, поскольку это «громкая» ошибка:пользователи вашего программного обеспечения сразу это заметят.Любая другая «громкая» реализация также приемлема.
Другие советы
1) Какова цель функции __cxa_pure_virtual()?
Чистые виртуальные функции могут вызываться во время создания/разрушения объекта.Если это произойдет, вызывается __cxa_pure_virtual(), чтобы сообщить об ошибке.Видеть Откуда берутся сбои «вызова чисто виртуальной функции»?
2) Почему вам может потребоваться определить это самостоятельно?
Обычно эта функция предоставляется libstdc++ (например.в Linux), но avr-gcc и набор инструментов Arduino не предоставляют библиотеку libstdc++.
Arduino IDE удается избежать ошибки компоновщика при сборке некоторых программ, поскольку она компилируется с параметрами «-ffunction-sections -fdata-sections» и связывается с «-Wl,--gc-sections», что удаляет некоторые ссылки на неиспользуемые символы. .
3) Почему допустимо кодировать __cxa_pure_virtual() как бесконечный цикл?
Что ж, это, по крайней мере, безопасно;он делает что-то предсказуемое.Было бы полезнее прервать программу и сообщить об ошибке.Однако бесконечный цикл было бы неудобно отлаживать, если у вас нет отладчика, который может прерывать выполнение и возвращать трассировку стека.