Вопрос с определениями сложных типов c ++ - PullRequest
1 голос
/ 20 апреля 2020

Итак, я увидел это во фрагменте кода онлайн:

typedef LRESULT(CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

Что я хочу знать здесь, это структура.

Что это значит?

Я прочитал документацию msdocs для typedefs, но я все еще не могу понять, что это здесь делает, поэтому я знаю, что он хочет дать синоним для LRESULT, но что здесь делает (CALLBACK* WNDPROC), делает это означает, что имя f_EndScene как указатель на CALLBACK, который принимает (HWND, UINT, WPARAM, LPARAM) параметры, является синонимом LRESULT?

Я действительно не могу обернуть это вокруг.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

WNDPROC - это имя typedef. Я признаю, что зная, что это немного искусства. Правило в основном состоит в том, что имя переменной typedef / на самом деле является самой внутренней вещью в объявлении. Начиная с имени, двигайтесь вправо, когда можете, и влево, когда необходимо, соблюдая скобки (правило спирали). Объявление фактически гласит:

Объявить псевдоним типа WNDPROC как указатель на CALLBACK функцию, принимающую аргументы HWND, UINT, WPARAM и LPARAM, возвращающую LRESULT.

Спиральное правило в основном происходит от вложенности. Начиная с простейшей возможной определения типа и неоднократно заменяя место, где идет фактическое имя определения типа, на «пропущенный» бит дерева:

typedef LRESULT WNDPROC; // WNDPROC = LRESULT
typedef LRESULT WNDPROC(...); // WNDPROC = function taking (...) returning LRESULT
typedef LRESULT (CALLBACK WNDPROC)(...); // WNDPROC = CALLBACK function taking (...) returning LRESULT
typedef LRESULT (CALLBACK *WNDPROC)(...); // WNDPROC = pointer to CALLBACK function taking (...) returning LRESULT
2 голосов
/ 20 апреля 2020

Этот typedef объявляет тип WNDPROC, это указатель на тип функции.

Все это соответствует стандарту C и C ++, кроме CALLBACK. CALLBACK - это макрос, который расширяется до __stdcall, который является одним из соглашений о вызовах x86. (На x64 вы можете игнорировать __stdcall, на x64 есть (в основном) только один вызывающий вызов convetnion)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...