«Привязка» указателей функций при загрузке

Итак, я возился с объектно-ориентированным подходом в C, создавая простой небольшой стек, используя структуру «класс» и структуру «экземпляр» typedef. Структура класса просто заполнена указателями функций, которые работают с указателями на структуры экземпляров. Когда я впервые занялся этим, я сказал себе: «Я просто привяжу указатели при инициализации структуры экземпляра!» Вы можете догадаться, что это не сработало, поскольку моя функция инициализации на самом деле была указателем, которому еще не было присвоено значение.

(сейчас почти 5 утра - скорее время пробуждения, чем время сна)

Итак, я спрашиваю, есть ли способ эффективно связать указатели функций во время выполнения, чтобы мне не нужно было явно вызывать функцию, которая их связывает - я подумал, может быть, какой-то аналог atexit.


person Sean Allred    schedule 20.07.2012    source источник
comment
Посмотрите, stackoverflow.com/q/5222008/365188 ИЛИ stackoverflow.com/q/4880966/365188 - это то, что вы ищете   -  person Ozair Kafray    schedule 20.07.2012
comment
GCC работает отлично для меня, но его нельзя переносить. Вторая предоставленная вами ссылка определенно не является переносимой XD (насколько я могу судить)   -  person Sean Allred    schedule 20.07.2012
comment
Кто не может просто объявить структуру класса как статический объект, инициализированный правильными указателями функций?   -  person dpi    schedule 20.07.2012
comment
@vermiculus: посмотрите на этот ответ для портативного решения! Наверное, единственный   -  person Ozair Kafray    schedule 20.07.2012


Ответы (1)


Если структура класса всегда одна и та же, вы можете инициализировать ее статически:

void do_x_to_instance(instance *);
struct class_type {
    void (*do_x)(instance *);
    ...
} myclass = {
    &do_x_to_instance,
    ...
};

Вот как API Python C работает, например, для определения типов расширений.

person ecatmur    schedule 20.07.2012
comment
Смогу ли я сделать это, даже если функции еще не определены? - person Sean Allred; 21.07.2012
comment
@vermiculus да, если функция была объявлена ​​в этот момент, вы можете взять на нее указатель функции; компоновщик гарантирует, что указатель функции принимает правильное значение. - person ecatmur; 23.07.2012