Здравствуйте, VTT, Вы писали:
VTT>Здравствуйте, _hum_, Вы писали:
VTT>0) заводит стек функций
__>>не совсем понял, в каком месте (и в какой ситуации) не пройдет описанный мною выше алгоритм?
VTT>Да с самого начала. В общем случае у компилятора нет никакой возможности построить этот стек вызовов. Вот например: метод foo_B класса C_B вызывается через указатель на абстрактный базовый класс. О том, что вызвался метод именно в классе C_B мы можем узнать только в runtime.
кхм.. извиняюсь, а как, по-вашему, компилятор генерирует код, если он не в курсе, кто что будет вызывать?
может, давайте все-таки на конкретном примере, и я вместо компилятора попробую вам пройтись по алгоритму?
если брать мой первоначальный пример, и считать, что там
void foo_A(void)class_const;
то компилятор будет действовать так:
— первый раз пробегает по тексту программы и заносит себе в память информацию о том, какие функции в программе объявлены (какие у них сигнатуры), и где у каждой объявленной функции определение (текст тела функции);
— второй раз пробегает по тексту программы и, встретив декларацию функции "foo_A(void)
class_const", заносит ее первой в стек;
а дальше по п. 2)
берет с вершины стека foo_A(void)
class_const и переходит к ее телу (информация о том, где оно , уже имеется после первого прохода):
void C_A::foo_A(void)const
{
m_pB->foo_B();
}
в теле видит вызов функции void foo_B(void), потому заносит его сигнатуру в стек; и т.д.
в каком месте он может споткнуться?
upd. может, вы имели в виду виртуальные функции? ну, так о них пока речь не шла (там можно либо все проверять, либо договориться, что в таких случаях виртуальные использовать нельзя).