windows 프로그래밍을 하기 전에 코딩 규칙을 먼저 알아보아야 한다.
단순한 C++과는 다른 별도의 typedef, 표기 등이 추가되어 사용된다. 그렇기 때문에 개발을 시작하기 전에 우선 알아두어야 할 필요가 있어 정리를 한다.
windows헤더에는 많은 typedef들이 포함되어 있으며 대부분은 WinDef.h에 정의되어 있다.
데이터 형식 | 크기 | signed, unsigned |
---|---|---|
BYTE | 8 bits | Unsigned |
DWORD | 32 bits | Unsigned |
INT32 | 32 bits | Signed |
INT64 | 64 bits | Signed |
LONG | 32 bits | Signed |
LONGLONG | 64 bits | Signed |
UINT32 | 32 bits | Unsigned |
UINT64 | 64 bits | Unsigned |
ULONG | 32 bits | Unsigned |
ULONGLONG | 64 bits | Unsigned |
WORD | 16 bits | Unsigned |
이 Typedef들은 어느정도의 중복성을 갖고 있는데 이들 중 일부는 단순히 windows api의 역사 때문이고 사용의 용도에 따라서 사용하면 될 것 같다.
그리고 여기에 나와있는 Type들은 모두 고정적인 크기를 갖고 있으며 32-bit, 64-bit 두 환경 모두 동일하다.
win32의 BOOL은 int 타입의 별칭이며 C++의 bool 및 다른 boolean을 대표하는 타입들과는 다른 형태이다.
간단하게 이야기 하자면 win32는 C언어 기반의 api이기 때문에 boolean이 별도로 정의되어 있지 않다. 그렇기 때문에 int 타입을 사용하고 있는것이다.
WinDef.h에 정의되어있는 BOOL은 다음과 같이 두 가지 값을 정의하고있다.
#define FALSE 0
#define TRUE 1
이렇게 정의된 BOOL은 어디까지나 TRUE인지 FALSE인지를 확인하기 위해 사용되어야 한다.
// Right way.
if (SomeFunctionThatReturnsBoolean())
{
...
}
// or
if (SomeFunctionThatReturnsBoolean() != FALSE)
{
...
}
어디까지나 이 BOOL타입은 int의 형태를 갖고 있기 때문에 C++의 bool처럼 사용하게 되면 정의되지 않은 동작을 일으킬 수 있기 때문에 사용해선 안된다.
if (result == TRUE) // Wrong!
{
...
}
Windows는 많은 데이터 타입에 대한 포인터를 정의해놓았다. 일반적으로 P 혹은 LP를 접두사로 사용한다.
예를 들면, LPRECT는 RECT의 포인터를 정의해 놓은 것이고, 이 RECT는 직사각형을 정의하는 구조체이다.
변수 선언은 다음과 같이 하며 아래의 세 가지 선언은 모두 동일하다고 볼 수 있다.
RECT* rect; // Pointer to a RECT structure.
LPRECT rect; // The same
PRECT rect; // Also the same.
그렇다면 이렇게 선언을 나눠놓은 이유는 뭘까?
16-bit 아키텍쳐에서 P를 접두사를 사용하는 변수는 "pointer"를 나타내고, LP를 접두사로 사용하는 변수는 "long pointer"를 나타낸다.
여기서 long pointer는 원거리 포인터라고도 부르며 이 long pointer는 현재 세그먼트 범위 밖의 메모리 공간을 가리키는데에 사용되었지만 지금은 용도를 구분 짓고있지 않고 있으며 현재까지도 남아있는 이유는 16-bit코드를 32-bit로 쉽게 이식하기 위해서 남아있다.
그렇기 때문에 이런 접두사는 피해야 하며 만약 사용해야 한다면 "P"만을 사용하기를 권한다.
Windows에서는 포인터의 사이즈를 위한 정의도 있다.
이 데이터 타입들은 모두 32-bit 어플리케이션에서는 32bit의 너비를 가지고 64-bit 어플리케이션에서는 64bit의 너비를 가지며 이 너비는 컴파일 타임에 정해진다.
만약 32-bit 어플리케이션을 64-bit 환경에서 구동하면 이 데이터 타입의 너비는 어떻게 될까?
답은 변함없이 4byte의 크기를 가지며 구동된다.
하지만 그 반대의 상황인 64-bit -> 32-bit는 애초에 동작이 되지 않기 때문에 주의해야 한다.
이 데이터 타입들의 사용되는 곳은 다음과 같다.