2015-08-19 2 views
2

Оба используются для хранения адресов и выполнения арифметических указателей, оба определены в WinAPI, когда следует использовать uintptr_t (cstdint) против DWORD_PTR (Windows.h)? Оба 32bits и 64bits в x86 и x86_64 соответственноИспользование uintptr_t vs DWORD_PTR

DWORD_PTR является unsigned long типа, используемым для точности указателя. Он используется при наведении указателя на тип unsigned long для выполнения арифметики указателя. DWORD_PTR также широко используется для общих 32-битных параметров, которые были расширены до 64 бит в 64-разрядной Windows.

Я не хочу, чтобы мой код был портативным, я застрял в WinAPI. Какой тип наилучшего варианта использования?

+2

Я никогда не использую typedefs Windows, если напрямую не работает с функциями Windows API. И даже тогда я в конечном итоге использую 'reinterpret_cast'. – camelCase

+0

Я бы выбрал 'uintptr_t', хотя бы потому, что это не SCREAM AT YOU. И за то, что «DWORD» - это ложь в 64 бита, а код, который вам лежит, ужасен. («sizeof (DWORD) байтов должно быть достаточно для всех» ...) – molbdnilo

ответ

7

Предпочитает uintptr_t Это часть стандарта C++ с C++ 11 и более поздних версий. DWORD_PTR специфичен для Visual C++ и поэтому не переносится.

Хотя Visual C++ может выбрать для реализации uintptr_t как DWORD_PTR или unsigned long под капотом, то есть к ним, чтобы сделать, вы безопаснее прилипание к стандартной библиотеке.

1

uintptr_t (на самом деле std::uintptr_t в C++) является не определено в WinAPI, это определено в стандарте C++ заголовок <cstdint>. Стандартная библиотека C++ определяется языком C++ и не имеет ничего общего с WinAPI.

Если вы хотите использовать тип взаимодействия с WinAPI, используйте DWORD_PTR, так как это ожидают функции WinAPI.

Для других целей это действительно зависит от вас. Я предпочитаю стандартные типы по сравнению с платформами, поэтому я бы использовал std::uintptr_t, но это возможно.

 Смежные вопросы

  • Нет связанных вопросов^_^