DWORD определен в WinAPI так же, как DWORD в сборке

в WinAPI:

typedef unsigned long DWORD;

Я думаю, что DWORD, WORD ... это основной тип данных в компьютере, независимо от того, int, unsigned long ... он будет преобразован в DWORD, наконец, в сборке, почему он должен быть преобразован в unsigned long здесь? Могу ли я использовать DWORD напрямую без определения?


person Searene    schedule 17.11.2011    source источник


Ответы (2)


DWORD — это то, чем оно определено (в сборке нет автоматического преобразования в определенную ширину). Этот typedef необходим, потому что все интерфейсы WinAPI определяются с помощью unsigned long везде, где используется DWORD. IOW, это определение необходимо для работы с API.

Чтобы ответить на ваш другой вопрос. Этот ответ - нет, DWORD нельзя использовать без определения. Это не встроенный тип для компилятора.

Определение DWORD исправлено для Win32 API: http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx

person Raymond Hettinger    schedule 17.11.2011

В API Windows и в языках ассемблера, основанных на наборе инструкций x86, DWORD обозначает переменную размером 32 бита. Так что да, обычно они одного размера.

Вы не можете использовать тип DWORD в C++ без его определения, потому что он не является частью основного языка. Определение типа DWORD может потребоваться изменить в зависимости от вашего компилятора и архитектуры системы. Видимо, для вашей конфигурации тип unsigned long имеет 32 бита, поэтому DWORD определяется как unsigned long.

person ddso    schedule 17.11.2011
comment
В большинстве языков ассемблера слово имеет длину 32 бита, поскольку слово обычно является естественным типом данных в процессоре. x86 немного странный, потому что это расширение 16-битной архитектуры, поэтому здесь слово — это 16 бит, а двойное слово или двойное слово — 32. Так что это неверно для большинства языков ассемблера. - person jalf; 17.11.2011
comment
Ну, я знаю только NASM, MASM и TASM, где слово 16 бит по устаревшим причинам, а DWORD означает 32 бита. Например, DWORD исправлен, потому что в противном случае это могло бы вызвать путаницу, по той же причине, по которой он исправлен в Windows API. У меня сложилось впечатление, что это наиболее часто используемые и что это будет похоже на другие языки ассемблера. - person ddso; 17.11.2011
comment
это не то, что я бы назвал разными языками ассемблера. Это разные ассемблеры, но все они ориентированы на один и тот же набор инструкций. Все они используют DWORD для обозначения одного и того же, потому что DWORD определено Intel в наборе инструкций. Ассемблер для процессоров MIPS, PowerPC или ARM вообще не будет использовать DWORD или с тем же значением, если только эти процессоры также не определяют этот термин. - person jalf; 17.11.2011