Какова цель __cxa_pure_virtual? - PullRequest
48 голосов
/ 28 мая 2009

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

undefined reference to `__cxa_pure_virtual'

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

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

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

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

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

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

Ответы [ 2 ]

38 голосов
/ 28 мая 2009

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

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

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

20 голосов
/ 20 февраля 2012

1) Какова цель функции __cxa_pure_virtual ()?

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

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

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

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

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

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

...