Что это означает, когда символы Boost.Exception появляются в выводе ‘nm’? Будут ли они причиной нарушений ODR?

Я запускаю это в сторонней статически связанной библиотеке. Я думал, что, поскольку это библиотека только для заголовков (за исключением некоторых версий MSVC), она не будет отображаться. Может быть, я неправильно понимаю, что NM должен показать. Что я действительно хочу знать, так это то, будут ли они вызывать нарушения ODR, если я создаю ссылку на библиотеку, скомпилированную с другой версией Boost.

Смотрите вывод на: http://codepad.org/kJ86hiQg

Краткая выборка:

    W boost::exception_detail::clone_base::~clone_base()
W boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >::~clone_impl()
W boost::exception_detail::cloning_base::~cloning_base()
W boost::exception_detail::counted_base::~counted_base()
W boost::exception::~exception()

0

Решение

Они кажутся слабыми символами.

http://en.wikipedia.org/wiki/Weak_symbol


Обновить Нарушения ODR не являются вызванный по дубликатам записей компоновщика в первую очередь. Они есть вызванный когда компилятор использует разные определения символов с тем же именем.

Итак, короткий ответ: нет nm показывая эти слабые символы не вызвать или указать нарушения ODR. Однако тот факт, что эти символы являются слабыми, не означает, что не может быть и нарушения ODR.

На самом деле, я думаю, что вполне возможно иметь нарушения ODR без таких символов (например, когда структура структуры с тем же искаженным именем отличается из-за разных параметров выравнивания или упаковки) в разных единицах перевода.

1

Другие решения


По вопросам рекламы [email protected]