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

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

Ответ 1

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

Ответ 2

Чтобы разработать (Нил Баттерворт и синие .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 для Max или что-то в этом роде.

Ответ 3

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

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