Яка різниця між WIN32 та _WIN32 визначається в C ++


Відповіді:


53

WIN32це ім’я, яке ви можете використовувати і навіть визначити у власному коді, що може суперечити використанню корпорацією Майкрософт. _WIN32- це ім’я, яке зарезервовано для реалізатора (в даному випадку Microsoft), оскільки воно починається з підкреслення та великої літери - вам не дозволяється визначати зарезервовані імена у власному коді, тому не може бути зіткнення.


Коли ви говорите "використовувати", ви маєте на увазі, що я міг би: #define WIN32 12345 або: #ifdef WIN32
Адам Нейлор

під "використанням" я маю на увазі #ifdefі #define. _WIN32призначений для використання будь-яким програмуванням у контексті #ifdef.
Ганс-Крістоф Штайнер

81

Для детального пояснення (Ніл Баттерворт та blue.tuxedo вже дали правильну відповідь):

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

Ви знайдете аналогічний набір подвійних Визначає з майже однаковими назвами та аналогічними цілями , такі як _UNICODE/ UNICODE, _DEBUG/ DEBUG, або , може бути , _DLL/ DLL(я думаю , що тільки ті , UNICODE отримують більшу частину будь-якого використання в їх різних версіях). Хоча іноді в цих випадках (як _UNICODE), замість версії підкреслення визначається з допомогою компілятора, вони використовуються для управління , що роблять заголовки CRT:

  • _UNICODEповідомляє заголовки ЕПТ, що імена ЕПТ можуть бути як Unicode, так і ANSI (наприклад, _tcslen()мають відображати широкий варіант символів ( wcslen())
  • UNICODEробить щось подібне для SDK (пов'язує API " W" Win32 з їх варіантами)

По суті, версії з підкресленням контролюються або використовуються командою компілятора, версії без підкреслення контролюються / використовуються командами поза компілятором. Звичайно, мабуть, буде багато перекриттів через сумісність із попередніми версіями та просто загальні помилки однієї чи іншої команди.

Я вважаю це заплутаним як пекло - і виявляю, що вони використовуються майже взаємозамінно в коді користувача (зазвичай, коли ви бачите один визначений, ви побачите інший, визначений там же, тому що якщо вам потрібен один, вам потрібен інший). Особисто я вважаю, що вам слід використовувати версії без підкреслення (якщо ви не пишете час роботи компілятора) і переконайтесь, що вони обидва визначаються (чи через слухачі, чи за допомогою комутаторів компілятора), коли ви визначаєте їх.


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


19

WIN32 - це визначений користувачем прапор, який може знадобитися деяким заголовкам. _WIN32 автоматично визначається візуальним компілятором C / C ++. Оскільки він починається з символу _, за яким слідує символ великої літери, він зарезервований реалізацією (мається на увазі постачальник набору інструментів C / C ++).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.