program story

C ++에서 정의하는 WIN32와 _WIN32의 차이점은 무엇입니까?

inputbox 2020. 11. 4. 07:57
반응형

C ++에서 정의하는 WIN32와 _WIN32의 차이점은 무엇입니까?


나는 그것이 WIN32win32 컴파일 나타내는 것을 알고 있지만 무엇을 _WIN32위해 사용됩니까?


WIN32자신의 코드에서 사용하고 정의 할 수있는 이름이므로 Microsoft의 사용과 충돌 할 수 있습니다. _WIN32밑줄과 대문자로 시작하기 때문에 구현 자 (이 경우 Microsoft)를 위해 예약 된 이름입니다. 자체 코드에서 예약 된 이름을 정의 할 수 없으므로 충돌이 없습니다.


자세히 설명하기 위해 (Neil Butterworth 및 blue.tuxedo는 이미 정답을 제공했습니다) :

  • WIN32 SDK 또는 빌드 환경에서 정의하므로 구현 예약 네임 스페이스를 사용하지 않습니다.
  • _WIN32컴파일러에 의해 정의 되므로 밑줄을 사용하여 구현 예약 네임 스페이스에 배치합니다.

당신은 거의 동일한 이름과 같은 유사한 용도로 듀얼을 정의 비슷한 설정을 찾을 수 있습니다 _UNICODE/ UNICODE, _DEBUG/ DEBUG, 또는 어쩌면 _DLL/ DLL(난 단지 유니 코드 사람이 서로 다른 버전의 모든 사용의 많은 수 있다고 생각). 때로는 이러한 경우 (예 _UNICODE:) 컴파일러에 의해 정의 되는 밑줄 버전 대신 CRT 헤더가 수행하는 작업을 제어하는 ​​데 사용됩니다.

  • _UNICODE유니 코드 또는 ANSI 일 수있는 CRT 이름 (예 : _tcslen()와이드 문자 변형 ( wcslen())에 매핑되어야 함)을 CRT 헤더에 알립니다.
  • UNICODESDK에 대해 유사한 작업을 수행합니다 (Win32 API를 " W"변형에 매핑 ).

기본적으로 밑줄이있는 버전은 컴파일러 팀에서 제어하거나 사용하고, 밑줄이없는 버전은 컴파일러 외부의 팀에서 제어 / 사용합니다. 물론 이전 버전과의 호환성과 한 팀 또는 다른 팀의 일반적인 실수로 인해 많은 중복이있을 수 있습니다.

나는 그것이 지옥처럼 혼란스럽고 사용자 코드에서 거의 같은 의미로 사용된다는 것을 발견했습니다. 개인적으로 밑줄이없는 버전을 사용 하고 (컴파일러의 런타임을 작성하지 않는 한) 버전을 정의 할 때 둘 다 (청각 자 또는 컴파일러 스위치를 통해 적절하게) 정의되었는지 확인해야한다고 생각합니다.


SDK는 _WIN32Mac 용으로 빌드 정의 합니다. 컴파일러는 그렇지 않기 때문에 한계를 뛰어 넘습니다. 어떤 프로젝트가 Win32 API를 사용하고 Mac을 대상으로하는 컴파일러를 사용하는지 잘 모르겠습니다. 일부 버전의 Office for the Max 등일 수도 있습니다.


WIN32는 일부 헤더에 필요할 수있는 사용자 정의 플래그입니다. _WIN32는 Visual C / C ++ 컴파일러에 의해 자동으로 정의됩니다. _로 시작하고 뒤에 대문자가 나오므로 구현 (C / C ++ 도구 체인 공급자를 의미)에서 예약됩니다.

나는 _WIN32를 사용하는 것을 선호합니다.

참고 URL : https://stackoverflow.com/questions/662084/whats-the-difference-between-the-win32-and-win32-defines-in-c

반응형