вторник, 28 июля 2009 г.

typeinfo for int

Загадочный всетаки компилятор - gcc...

Начать реализацию обработки исключений я решил в простенькой конструкции в коде:

try {
throw 1;
} catch (...) {
}

Но наткнулся на ошибку - undefined reference to `typeinfo for int'.
И вот возникла непонятная задача - как же мне описать typeinfo for int?

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

Но необходимый мне typeinfo должен иметь другой тип: __fundamental_type_info. И мне нужно проинициализировать его статически, для чего я долго изголялся с размещающими new в статическом буфере...

Стоит отметить что до сих пор линкер исправно ругался на отсутсвие typeinfo. Но после этого неожиданно начал ругаться на отсутвие 'vtable for __cxxabiv1::__pointer_type_info', странно.

Исследование модуля objdump'ом показало в нем наличие большого количества typeinfo. Стал выяснять - откуда они взялись. И вот ведь загадочный gcc...

Стоит вставить следующий код:

namespace __cxxabiv1 {
class __fundamental_type_info : public std::type_info
{
virtual ~__fundamental_type_info() { }
};
}

Как все необходимые фундаментальные typeinfo появляются как по волшебству. И с размещающим new я изголялся зря. :)

А с исключениями пока еще далеко не все понятно, разбираюсь.

3 коммент.:

Kirikaza комментирует...
Этот комментарий был удален автором.
Андрей Валяев комментирует...

Не смотря на то, что автор удалил свой комментарий, отвечу... Что все дело именно в том, что стандартные библиотеки в моем проекте не подключены. Там специально для этого стоит: -nostdinc -nostdlib -nostartfiles -nodefaultlibs

Поэтому и натыкаюсь на такие интересные проблемы. :)

Kirikaza комментирует...

Автор прочитал сообщение внимательно и понял, что библиотеки специально не подключены. Потому и удалил свой комментарий ;)