Это побочный эффект объявления макроса в WinUser.h
.Он применяется не только к объявлению глобальной функции для API Windows, но также к любому другому идентификатору с именем SetWindowText
, который появляется в коде: глобальный, локальный или область действия класса.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
Так что любой класс C ++, которыйобъявляет, что метод с именем SetWindowText
получает весь этот метод, неявно преобразованный препроцессором.
У меня не установлено MFC, но я знаю, что этот метод существует для класса CWindow в ATL и определяется следующим образом.
class CWindow
{
public:
...
BOOL SetWindowText(_In_z_ LPCTSTR lpszString) throw()
{
ATLASSERT(::IsWindow(m_hWnd));
return ::SetWindowText(m_hWnd, lpszString);
}
...
};
Но во время компиляции приведенный выше код (для отладочной сборки) будет преобразован препроцессором во что-то вроде следующего:
BOOL SetWindowTextW( LPCTSTR lpszString) throw()
{
(void)( (!!((::IsWindow(m_hWnd)))) || (1 != _CrtDbgReportW(2, L"c:\\program files...
return ::SetWindowTextW(m_hWnd, lpszString);
}
Как ни странно, LPCTSTRПараметр метода - typedef'd вместо замены макроса, но вы понимаете, что это так.
Если у вас достаточно большое приложение для Windows, очень высока вероятность того, что один из ваших существующих классов C ++, который вы определили самостоятельно, имеетметод или переменная-член, которая соответствует Windows API.И он получает такое же лечение.