В чем разница между WIN32 и WIN32 определяется в C++
Я знаю, что WIN32
очевидно, чтобы обозначить компиляцию win32, но что нужно для _WIN32
?
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, кажется, безопаснее для меня.