Безумие типов

Тема в разделе "LANGS.C", создана пользователем Fedor666, 25 фев 2012.

  1. Fedor666

    Fedor666 Fedor

    Публикаций:
    0
    Регистрация:
    27 май 2009
    Сообщения:
    30
    Адрес:
    М.О., г.Королев
    Вот пример из SDK:
    Код (Text):
    1. 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$ совсем сбрендили на типах. Все это же простое двойное слово!
    Вопрос: как вырубить все эти дурные типы? А то у меня уже глаз дергается:dntknw:(( ибо в упор не вижу никакой разницы между HWND, HRESULT и т.д!
     
  2. GRRRLPower

    GRRRLPower New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    46
    Это вырубается методом написания кода на ассемблере.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Fedor666

    Ох лол @ фейспалм. C и C++ писали люди, которые, понимали, что архитектуры вычислительной техники бывают самые разные, они имеют разные шины данных и адреса, разные принципы адресации, различные особенности доступа к памяти, и т.д. Структура и размер адреса функции может отличаться от структуры и размера адреса данных. Именно поэтому и есть контроль типов - механизм, который предотвращает неявные преобразования, которые лишают программу кросс-платформенности.

    Что же касается конкретно вопроса, то гугли по запросу "C-style cast".
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Это что, такой жжжирный троллинг - на голубом глазу спрашивать какая разница между знаковым целым и указателем на функцию?
     
  5. Fedor666

    Fedor666 Fedor

    Публикаций:
    0
    Регистрация:
    27 май 2009
    Сообщения:
    30
    Адрес:
    М.О., г.Королев
    И то, и другое - двойное слово. Адрес тоже число. И тоже двойное слово.
    Что-то нездоровое...
    Этот бред обсолютно не нужен. Зачем почти каждая функция возвращает двойное слово собственного уникального типа? Нафига козе боян? Кроме путаницы это ни к чему не приводит:dntknw:(
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Fedor666
    Какое расширение у файла?
    Если .CPP, то попробуй .C
    Ещё попробуй в опциях поставить "Compile As C Code (/TC)".
     
  7. GRRRLPower

    GRRRLPower New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    46
    А потом ты собираешь проект под x64 и ВНЕЗАПНО ничего не работает!
     
  8. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Зачем преобразовывать HWND в HRESULT? Если это происходит, то это на 99% ошибка.
     
  9. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Банальная вещь 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 бит. И всё прозрачно будут компилиться, без каких либо изменений.

    Именно по этому и введена строгая типизация переменных.

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

    Если углубляться во все тонкости, то постепенное станет понятно, что всё не просто так придумано, и тем более не для того, чтобы запутать пользователя кучей разных типов.
     
  10. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    есть и откровенно поддельные например
    подсистема GDI всякие HFONT HBITMAP HMENU HICON ...
    по сути все указатели на фейковые структуры для чего ?
    очевидно просто типобезопасность
    повыше кто ждет менюшку уже не примет хендл иконки а по сути если подходить сурово можно сказать и для запутывания один хрен все void* получается потому что арифметику с ними никто не делает их просто создают передают да освобождают да и указывают они на фейковые структуры что равнозначно void* почему же их сделали указателями на фейковые структыры ? ответ типобезопасность компилятор не позволяет смешивать указатели разных типов вот только непонятно одно можно же было сделать просто форвард декларации на фейковые структуры типа так
    Код (Text):
    1. #define DECLARE_HANDLE(name) typedef struct name##__ *name
    зачем было объявлять фейковую структуру ? для форвард декларации она вовсе не требуется
    Код (Text):
    1. #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
    2. DECLARE_HANDLE(HFONT);
    3. DECLARE_HANDLE(HBITMAP);
    4. DECLARE_HANDLE(HMENU);
    5. DECLARE_HANDLE(HICON);
    тут имхо надо разделять если смотреть на типы которые именно типы например все эти PBYTE ULONG_PTR DWORD то они безусловно сделаны для лучшей переносимости а если смотреть на всякие HFONT HBITMAP HMENU HICON то можно сказать это для запутывания но имхо удобно какая никакая а типобезопасность повышается

    тут тоже немного по теме
    http://www.codenet.ru/progr/bcb/Handle-Types.php