После сборки кода какой действительный тип данных будет вместо параметра 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 шт):

Автор решения: Fat-Zer
  • GdkEventButton — это обычная Си'шная структура... соответственно GdkEventButton * — указатель на неё, с точки зрения реализации это обычно адрес в памяти.
  • Операция -> — это доступ к полю через указатель, по сути синтаксический сахар для для (*event).type, т.е. указатель разыменовывается и в структуре на которую он указывает выбирается поле type.

На ассемблере после компиляции это сравнение будет выглядеть как-то так:

cmp [rax + offsetof(type)], 4

Подразумевая что указатель на event находится в rax, а offsetof(type) — смещение поля type в структуре GdkEventButton вычисляемое на стадии компиляции.

→ Ссылка