Вот пример из SDK: Код (Text): WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,&AppName,NULL}; А вот, что пишет M$ Visual C++ 6.0: error C2440: 'initializing' : cannot convert from 'int' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'. Понятно, что ребяты из M$ совсем сбрендили на типах. Все это же простое двойное слово! Вопрос: как вырубить все эти дурные типы? А то у меня уже глаз дергается(( ибо в упор не вижу никакой разницы между HWND, HRESULT и т.д!
Fedor666 Ох лол @ фейспалм. C и C++ писали люди, которые, понимали, что архитектуры вычислительной техники бывают самые разные, они имеют разные шины данных и адреса, разные принципы адресации, различные особенности доступа к памяти, и т.д. Структура и размер адреса функции может отличаться от структуры и размера адреса данных. Именно поэтому и есть контроль типов - механизм, который предотвращает неявные преобразования, которые лишают программу кросс-платформенности. Что же касается конкретно вопроса, то гугли по запросу "C-style cast".
Это что, такой жжжирный троллинг - на голубом глазу спрашивать какая разница между знаковым целым и указателем на функцию?
И то, и другое - двойное слово. Адрес тоже число. И тоже двойное слово. Что-то нездоровое... Этот бред обсолютно не нужен. Зачем почти каждая функция возвращает двойное слово собственного уникального типа? Нафига козе боян? Кроме путаницы это ни к чему не приводит(
Fedor666 Какое расширение у файла? Если .CPP, то попробуй .C Ещё попробуй в опциях поставить "Compile As C Code (/TC)".
Банальная вещь sizeof(DWORD) != sizeof(VOID*) on Win64 Преобразование типов очень важно. А также от типа зависит смысл работы. Пример (DWORD* и BYTE* по факту это указатель void* а на деле операции с ними разные) DWORD* Data1 = 0x11223344; BYTE* Data2 = 0x11223344; Data1++; // = 0x11223348 Data2++; // = 0x11223345 Многие типы хоть и дублируют DWORD, но сделаны для логического разделение. К тому же опять же, они могут быть в одном случае 32-х, а в другом 64-х битными. Еще пример ULONG_PTR - на x32 = 32 бита. на x64 - 64 бита. К тому же всё это сделано для совместимости с будущей версией. Появилась новая платформа (допустим 64 битная), сделали для неё тип большего размера и готово. А если везде использовать DWORD, то придется переписать программу при компиляции под другую платформу. К тому же HRESULT сейчас 32 бита, а к примеру через 100500 лет может стать 128 бит. И всё прозрачно будут компилиться, без каких либо изменений. Именно по этому и введена строгая типизация переменных. Просто у вас рассуждения сейчас в стиле - зачем мне еда, если я сейчас есть не хочу. нет, ну зачем вообще она придумана, я же не голодный. Если углубляться во все тонкости, то постепенное станет понятно, что всё не просто так придумано, и тем более не для того, чтобы запутать пользователя кучей разных типов.
есть и откровенно поддельные например подсистема GDI всякие HFONT HBITMAP HMENU HICON ... по сути все указатели на фейковые структуры для чего ? очевидно просто типобезопасность повыше кто ждет менюшку уже не примет хендл иконки а по сути если подходить сурово можно сказать и для запутывания один хрен все void* получается потому что арифметику с ними никто не делает их просто создают передают да освобождают да и указывают они на фейковые структуры что равнозначно void* почему же их сделали указателями на фейковые структыры ? ответ типобезопасность компилятор не позволяет смешивать указатели разных типов вот только непонятно одно можно же было сделать просто форвард декларации на фейковые структуры типа так Код (Text): #define DECLARE_HANDLE(name) typedef struct name##__ *name зачем было объявлять фейковую структуру ? для форвард декларации она вовсе не требуется Код (Text): #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name DECLARE_HANDLE(HFONT); DECLARE_HANDLE(HBITMAP); DECLARE_HANDLE(HMENU); DECLARE_HANDLE(HICON); тут имхо надо разделять если смотреть на типы которые именно типы например все эти PBYTE ULONG_PTR DWORD то они безусловно сделаны для лучшей переносимости а если смотреть на всякие HFONT HBITMAP HMENU HICON то можно сказать это для запутывания но имхо удобно какая никакая а типобезопасность повышается тут тоже немного по теме http://www.codenet.ru/progr/bcb/Handle-Types.php