Какую разницу между WIN32 и _WIN32 определяет в C ++ - PullRequest
66 голосов
/ 19 марта 2009

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

Ответы [ 3 ]

74 голосов
/ 19 марта 2009

Для уточнения (Нил Баттерворт и 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 для Макса или что-то в этом роде.

47 голосов
/ 19 марта 2009

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

18 голосов
/ 19 марта 2009

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

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

...