Для уточнения (Нил Баттерворт и blue.tuxedo уже дали правильный ответ):
WIN32
определяется SDK или средой сборки, поэтому он не использует зарезервированное для реализации пространство имен
_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 для Макса или что-то в этом роде.