После сборки кода какой действительный тип данных будет вместо параметра GdkEventButton * event?
После сборки кода какой действительный тип данных будет подставлен вместо GdkEventButton * event в функции on_button_press ? И какую операцию подставит компилятор с++ вместо стрелочки (->) , может это ссылка делегирующего типа ?
void on_button_press (GtkWidget* widget, GdkEventButton * event)
{
if (event->type == 4)
{
g_print(" pressed\n");
}
}
Я пытаюсь аналог такой функции вызвать на функциональном языке , вместо GdkEventButton * event я указывал тип данных который соответствует типу int в с++ и даже без написания аналога структуры _GdkEventButton на нажатие кнопки мышки срабатывание было , но вместо целочисленных данных возвращался адрес в шестнадцатеричном виде , а если создать домен или кортеж который по моему предположению соответствует структуре _GdkEventButton и элемент type указать в параметре функции срабатывание на нажатие будет , но всегда будет возвращаться ноль и даже если указать другой элемент возвращается ноль.
Ответы (1 шт):
GdkEventButton— это обычная Си'шная структура... соответственноGdkEventButton *— указатель на неё, с точки зрения реализации это обычно адрес в памяти.- Операция
->— это доступ к полю через указатель, по сути синтаксический сахар для для(*event).type, т.е. указатель разыменовывается и в структуре на которую он указывает выбирается полеtype.
На ассемблере после компиляции это сравнение будет выглядеть как-то так:
cmp [rax + offsetof(type)], 4
Подразумевая что указатель на event находится в rax, а offsetof(type) — смещение поля type в структуре GdkEventButton вычисляемое на стадии компиляции.