2013-02-20 3 views
17

나는 얼마 동안 Visual C++ Win32 프로그래밍을 배우고 있습니다. unsigned long, char, unsigned int 등과 같이 DWORD, WCHAR, UINT 등과 같은 데이터 유형이 사용되는 이유는 무엇입니까?표준 데이터 형식이 Win32 API에서 사용되지 않는 이유는 무엇입니까?

const char * 대신 WCHAR을 사용해야 할 때를 기억해야합니다. 정말 괴롭습니다. 처음에 표준 데이터 유형이 사용되지 않는 이유는 무엇입니까? Win32에 상응하는 코드를 암기하고이를 내 자신의 변수에도 사용하면 도움이됩니까?

+5

'WCHAR'은'char *'와 동일하지 않습니다 ... (나는 당신이 요구하는 것을 얻습니다) –

+0

이들은 Macro Assembler의 데이터 타입입니다. Windows 1.0이 주로 쓰여졌던 언어입니다. –

답변

17

예, 함수의 인수에 올바른 데이터 유형을 사용해야합니다. 그렇지 않으면 문제가 발생할 가능성이 있습니다.

그리고 이러한 유형 등등 오히려 int, char을 사용하는 것보다, 그들이하는 방법을 정의하는 이유

는 제거한다는 것이다 OS의 인터페이스에서 "컴파일러가 int는 다음과 같이 크기가되어야한다고 생각 어떤". 컴파일러 A 나 컴파일러 B 또는 컴파일러 C를 ​​사용하는 경우 모두 동일한 유형을 사용하기 때문에 아주 좋은 것입니다. 라이브러리 인터페이스 헤더 파일 만 유형 정의에 필요한 작업을 수행해야하기 때문입니다.

표준 유형이 아닌 유형을 정의하면 int을 16에서 32 비트로 쉽게 변경할 수 있습니다. Windows 용 최초의 C/C++ 컴파일러는 16 비트 정수를 사용했습니다. Windows가 32 비트 API를 얻은 것은 1990 년대 중반에서 후반까지였으며 그 시점까지는 16 비트 인 int을 사용하고있었습니다. 수백 개의 변수를 사용하는 잘 작동하는 프로그램을 가지고 있다고 상상해보십시오. 갑자기 모든 변수를 다른 것으로 변경해야합니다. 아주 좋지는 않을 것입니다. 특히 그 중 일부는 그렇습니다. 변수 중 일부는 32 비트 int로 이동해도 아무런 차이가 없으므로 변수를 변경할 필요가 없으므로 해당 비트를 변경하지 않아도됩니다. WCHARconst char 같은되는 것은 아니다

- WCHAR 정도로 wchar_t가 유사한 유형 인 "와이드 문자"이다.

그래서 "기본적으로"우리 자신의 형식 정의 "는 소스 코드를 변경하지 않고 기본 컴파일러 아키텍처를 변경할 수 있음을 보장하는 방법입니다. 기계 의존적 인 코딩을하는 모든 커다란 프로젝트는 이런 종류의 일을합니다.

+2

그리고 타사 컴파일러를 사용하는 경우'wchar_t'는 반드시'WCHAR'과 일치하지 않습니다. –

+0

좋은 지적 ...... –

+0

나는 의심 스럽다 ... 왜 GNU/리눅스에는 그런 문제가 없었습니까? –

11

intlong과 같은 기본 제공 유형의 크기 및 기타 특성은 컴파일러마다 다를 수 있으며 일반적으로 코드가 실행되는 시스템의 기본 아키텍처에 따라 다릅니다.

예를 들어, Windows가 원래 구현 된 16 비트 시스템에서 int은 16 비트였습니다. 최신 시스템에서는 int이 32 비트입니다.

Microsoft는 DWORD과 같은 형식을 정의하여 각기 다른 버전의 컴파일러 또는 Windows 코드를 컴파일하는 데 사용되는 다른 컴파일러간에 크기가 동일하게 유지됩니다.

그리고이 이름은 Microsoft에서 정의한 기본 시스템의 개념을 반영하기위한 것입니다. A DWORD은 "더블 워드"입니다 (정확하게 말하면, 머신의 "워드"는 현대 시스템에서는 32 비트 또는 64 비트 임에도 불구하고 Windows에서 32 비트입니다).

같은 uint16_tuint32_t<stdint.h>에 정의 된 고정 폭 유형을 사용하는 것이 더 좋을 수도 -하지만 사람들은 마이크로 소프트의 컴파일러는 완벽하지 않습니다 1999 ISO C 표준 (에 의해 C 언어로 소개되었다 오늘도 지원).

Win32 API와 상호 작용하는 코드를 작성하려면 해당 API에서 정의한 유형을 사용해야합니다. Win32와 상호 작용하지 않는 코드의 경우 원하는 형식을 사용하거나 사용중인 인터페이스에서 제안하는 형식을 사용하십시오.

9

역사적인 사고라고 생각합니다.

제 이론은 원래 Windows 개발자는 표준 C 유형 크기가 컴파일러에 의존한다는 것을 알고 있습니다. 즉, 하나의 컴파일러가 16 비트 정수와 32 비트 정수를 가질 수 있다는 것입니다. 그래서 그들은 일련의 typedef를 사용하여 다른 컴파일러간에 Window API를 이식 할 수있게하기로 결정했습니다. DWORD은 사용중인 컴파일러/아키텍처에 관계없이 32 비트 부호없는 정수입니다. 당연히 요즘은 uint32_t<stdint.h>에서 사용 하겠지만 그 당시에는 사용할 수 없었습니다.

유니 코드 항목의 경우 CHARWCHAR 대 문제는 TCHAR인데 다른 문제입니다.

그리고 통제가 어려워지고 typedef void VOID, *PVOID;과 같은 좋은 것들이 완전히 엉터리입니다.

+0

+1 PVOID에 대해 말도 안돼 :) –

+6

PVOID와 같은 것들이 과거와 멀리있는 포인터를 다루는 과거의 유물이라고 추측합니다. 분명히 오늘날에는 어리석은 것처럼 보이지만 사람들은 Windows API가 얼마나 역사적인지에 대해 감사하지 않습니다. – Luke

관련 문제