Какова цель __cxa_pure_virtual?

Во время компиляции с помощью avr-gcc я обнаружил следующие ошибки компоновщика:

undefined reference to `__cxa_pure_virtual'

Я нашел этот документ, в котором говорится:

Функция __cxa_pure_virtual - это обработчик ошибок, который вызывается при вызове чистой виртуальной функции.

Если вы пишете приложение на C ++, которое имеет чистые виртуальные функции, вы должны предоставить свою собственную __cxa_pure_virtual функцию обработчика ошибок. Например:

extern "C" void __cxa_pure_virtual() { while (1); }

Предлагаемое определение этой функции устраняет ошибки, но я хотел бы знать:

  • какова цель этой функции,
  • почему мне нужно определить это самому и
  • почему допустимо кодировать его как бесконечный цикл?

person Matthew Murdoch    schedule 28.05.2009    source источник
comment
Вы можете получить эту ошибку при использовании команды gcc, где вы должны использовать g++; Я сделал это хоть раз :)   -  person user2023370    schedule 25.05.2015


Ответы (2)


Если где-либо во время выполнения вашей программы создается объект с незаполненным указателем виртуальной функции, и при вызове соответствующей функции вы будете вызывать «чистую виртуальную функцию».

Описываемый вами обработчик должен быть определен в библиотеках по умолчанию, которые поставляются с вашей средой разработки. Если вы случайно опустите библиотеки по умолчанию, вы обнаружите, что этот обработчик не определен: компоновщик видит объявление, но не определение. Вот когда вам нужно предоставить свою версию.

Бесконечный цикл приемлем, потому что это «громкая» ошибка: пользователи вашего программного обеспечения сразу заметят это. Допустима и любая другая «громкая» реализация.

person xtofl    schedule 28.05.2009
comment
Что могло привести к тому, что указатель виртуальной функции не будет заполнен? Разве компилятор не обнаружит это и не предотвратит компиляцию? - person Matthew Murdoch; 28.05.2009
comment
@xtofl Спасибо, stackoverflow.com/questions/99552/ был особенно полезен. - person Matthew Murdoch; 28.05.2009

1) Для чего предназначена функция __cxa_pure_virtual ()?

Чистые виртуальные функции могут быть вызваны во время создания / разрушения объекта. Если это произойдет, вызывается __cxa_pure_virtual (), чтобы сообщить об ошибке. См. Откуда происходят сбои при вызове чисто виртуальных функций?

2) Зачем вам нужно определять это самостоятельно?

Обычно эта функция предоставляется libstdc ++ (например, в Linux), но avr-gcc и набор инструментов Arduino не предоставляют libstdc ++.

IDE Arduino удается избежать ошибки компоновщика при сборке некоторых программ, поскольку она компилируется с параметрами «-ffunction-section -fdata-section» и связывает с «-Wl, - gc-section», что отбрасывает некоторые ссылки на неиспользуемые символы. .

3) Почему допустимо кодировать __cxa_pure_virtual () как бесконечный цикл?

Что ж, это по крайней мере безопасно; это делает что-то предсказуемое. Было бы полезнее прервать программу и сообщить об ошибке. Бесконечный цикл было бы неудобно отлаживать, если только у вас нет отладчика, который может прерывать выполнение и давать обратную трассировку стека.

person Mark Seaborn    schedule 20.02.2012