2012-03-07 2 views
1

В MFC VC++, setTimer функция установлена ​​с использованием процедуры CALLBACK. Из link я прочитал, чтоЯвляется ли предшествующей функции с CALLBACK или WINAPI или PASCAL (в MFC) абсолютно необходимой или только для удобства чтения?

Функция, которая помечена __stdcall использует стандарт призывающего конвенции названной так, потому что все функции Win32 API (за исключением немногих , которые принимают переменные аргументы) использовать его.

И от этого, это то, что я понял, ВСЕ ФУНКЦИИ VC++ MFC ИСПОЛЬЗУЮТ __stdcall как их вызывающие преобразования.

И CALLBACK определяется следующим образом ....

#define CALLBACK __stdcall 

То, что я прочитал: Предшествующая функция с CALLBACK используется, чтобы подчеркнуть, что конкретная функция будет вызываться автоматически при необходимости (например, в этом случае setTimer или onClick случае в JavaScript),

Мои сомнения, в MFC VC++ все функции (за исключением немногих , которые принимают переменные аргументы) имеет соглашение об использовании __stdcall по умолчанию. Следовательно, либо предшествующий, либо не предшествующий функции с CALLBACK или WINAPI или PASCAL имеет такой же эффект?

ответ

0

Это абсолютно необходимо для компьютера? Это зависит от контекста. When you mismatch the calling convention, вам может повезти, потому что типы данных в стеке соответствуют требованиям API, или он может терпеть неудачу, когда ваш код равен run on a different architecture like x64, и каждый раз сбой.

Это абсолютно необходимо для обслуживания программиста? Да, это так. Вы знаете, бедный человек, которому придется разобраться в ваших нестандартных соглашениях и умных «оптимизациях». Когда-нибудь этот бедный человек может быть вами.

The compiler was yelling at you for a reason, когда вы пытались подорвать API.