Назначение прописного макроса VOID и INT typedef в winnt.h - PullRequest
7 голосов
/ 12 июля 2011

Кто-нибудь может подсказать, почему в заголовке winnt.h определен макрос VOID в верхнем регистре?

Чтобы еще более запутать, макрос VOID - это макрос, тогда как CHAR, SHORT, INT и LONG являются typedefs.

См. Соответствующий отрывок из winnt.h:

#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#if !defined(MIDL_PASS)
typedef int INT;
#endif
#endif

Историческая причина, по которой можно сделать VOID* pointer вместо void* pointer?

РЕДАКТИРОВАТЬ : Еще более тревожно видеть людей, использующих VOID вместо void при программировании Windows сегодня .Вы также можете увидеть его как часть документов MSDN, например, http://msdn.microsoft.com/en-us/library/bb205867(v=vs.85).aspx

Ответы [ 2 ]

18 голосов
/ 12 июля 2011

API Windows устарел. Действительно старый. Более старый, чем официальный стандарт С старый.

Это означает, что на начальном этапе Windows API приходилось иметь дело со всеми видами древних компиляторов Си с разными уровнями языковой поддержки. Некоторые могут не поддерживать void. Некоторые могут иметь тип int, который не совместим с тем, что Windows считает int. Некоторые могут не понимать short. В качестве обходного пути Windows API предоставляет переносимые эквиваленты в верхнем регистре, которые имеют псевдонимы для всего, что работает для этого конкретного компилятора.

Конечно, с современными компиляторами все немного успокоилось. Все поддерживают void, например. Однако, чтобы поддерживать совместимость со старым кодом, который использует эти макросы верхнего регистра, #define s и typedef s должны остаться.

12 голосов
/ 12 июля 2011

Первоначальная причина заключается в том, что Win32 API изначально должен был быть независимым от языка, поэтому они составляли свои собственные имена (следуя своему соглашению об именах), а затем предоставили реализацию этого на языке C.В действительности, большая часть того, что они определили, как правило, игнорируется большинством людей, использующих другие языки (и в значительной степени даже людьми, использующими C, если на то пошло).вместо typedef это довольно просто: требуемый typedef будет равным typedef void VOID;, но C (как «определено» компиляторами Microsoft того времени) просто не позволяет этого,поэтому вместо них используется макрос.

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