В чем разница между WIN32 и WIN32 определяется в C++


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

3 63

3 ответа:

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

чтобы уточнить (Нил Баттерворт и синий.смокинг уже дал правильный ответ):

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

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

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

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

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


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

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

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