В чем разница между именами WIN32 и _WIN32 в C ++

Я знаю, что WIN32 , очевидно, означает компиляцию win32, но какая потребность в _WIN32 ?

WIN32 – это имя, которое вы могли бы использовать и даже определять в своем собственном коде и, таким образом, могли бы столкнуться с использованием Microsoft. _WIN32 – это имя, которое зарезервировано для разработчика (в данном случае Microsoft), потому что оно начинается с подчеркивания и прописной буквы – вам не разрешено определять зарезервированные имена в вашем собственном коде, поэтому не может быть никакого столкновения.

Чтобы разработать (Нил Баттерворт и синие.tuxedo уже дали правильный ответ):

  • WIN32 определяется SDK или средой сборки, поэтому он не использует зарезервированное пространство имён реализации
  • _WIN32 определяется компилятором, поэтому он использует _WIN32 подчеркивания для размещения его в пространстве имен, зарезервированных для реализации

Вы найдете аналогичный набор двойственных определений с почти идентичными именами и аналогичными приложениями, такими как _UNICODE / UNICODE , _DEBUG / DEBUG или, возможно, _DLL / DLL (я думаю, что только UNICODE очень полезны в разных версиях) , Хотя иногда в этих случаях (например, _UNICODE ) вместо версии подчеркивания, определяемой компилятором, они используются для управления заголовками CRT:

  • _UNICODE сообщает заголовкам CRT, что имена CRT, которые могут быть либо Unicode, либо ANSI (например, _tcslen() должны отображаться в варианте с широким символом ( wcslen() )
  • UNICODE делает что-то подобное для SDK (сопоставляет API Win32 с их вариантами « W »)

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

Мне кажется, что это сбивает с толку – и обнаружите, что они используются почти взаимозаменяемо в пользовательском коде (обычно, когда вы видите один определенный, вы увидите, что другие определены в одном и том же месте, потому что если вам это нужно, то вам нужно другое). Лично я считаю, что вы должны использовать версии без подчеркивания (если вы не пишете среду выполнения компилятора) и убедитесь, что оба они определяются (независимо от того, являются ли слушатели или компиляторы соответствующими), когда вы их определяете.


Обратите внимание, что SDK будет определять _WIN32 при построении для Mac, потому что компилятор этого не делает, что означает превышение его границ. Я не уверен, какие проекты используют Win32 API, а компилятор предназначен для Mac – возможно, какая-то версия Office для Max или что-то еще.

WIN32 – это определяемый пользователем флаг, который может потребоваться некоторыми заголовками. _WIN32 автоматически определяется визуальным компилятором C / C ++. Поскольку он начинается с символа _, за которым следует символ капитала, он зарезервирован реализацией (что означает поставщик привязки C / C ++).

Я предпочитаю использовать (читай) _WIN32, кажется мне более безопасным.

  • Условная компиляция в зависимости от версии фреймворка в C #
  • #define vs const в Objective-C
  • Вариадические рекурсивные macros препроцессора - возможно ли это?
  • Что такое хорошая ссылочная документирование шаблонов использования X-Macros в C (или, возможно, C ++)?
  • Являются ли typedef и #define одинаковыми в c?
  • Разрешены ли пустые определения макросов в C? Как они себя ведут?
  • Псевдо-дженерики в C
  • Макро против функции в C
  • Как объединить два раза с препроцессором C и развернуть макрос, как в «arg ## _ ## MACRO»?
  • Как определить платформу / компилятор из макросов препроцессора?
  • Есть ли способ сделать #define внутри другого #define?
  • Давайте будем гением компьютера.