[ Windows ] Windows 코딩 규칙

채명석·2022년 10월 31일
0

Windows

목록 보기
1/1

windows 프로그래밍을 하기 전에 코딩 규칙을 먼저 알아보아야 한다.
단순한 C++과는 다른 별도의 typedef, 표기 등이 추가되어 사용된다. 그렇기 때문에 개발을 시작하기 전에 우선 알아두어야 할 필요가 있어 정리를 한다.

Typedef

windows헤더에는 많은 typedef들이 포함되어 있으며 대부분은 WinDef.h에 정의되어 있다.

데이터 형식크기signed, unsigned
BYTE8 bitsUnsigned
DWORD32 bitsUnsigned
INT3232 bitsSigned
INT6464 bitsSigned
LONG32 bitsSigned
LONGLONG64 bitsSigned
UINT3232 bitsUnsigned
UINT6464 bitsUnsigned
ULONG32 bitsUnsigned
ULONGLONG64 bitsUnsigned
WORD16 bitsUnsigned

이 Typedef들은 어느정도의 중복성을 갖고 있는데 이들 중 일부는 단순히 windows api의 역사 때문이고 사용의 용도에 따라서 사용하면 될 것 같다.
그리고 여기에 나와있는 Type들은 모두 고정적인 크기를 갖고 있으며 32-bit, 64-bit 두 환경 모두 동일하다.

Boolean Type

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!
{
    ... 
}

참고

Pointer Types

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"만을 사용하기를 권한다.

Pointer Precision Types

Windows에서는 포인터의 사이즈를 위한 정의도 있다.

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

이 데이터 타입들은 모두 32-bit 어플리케이션에서는 32bit의 너비를 가지고 64-bit 어플리케이션에서는 64bit의 너비를 가지며 이 너비는 컴파일 타임에 정해진다.

만약 32-bit 어플리케이션을 64-bit 환경에서 구동하면 이 데이터 타입의 너비는 어떻게 될까?
답은 변함없이 4byte의 크기를 가지며 구동된다.
하지만 그 반대의 상황인 64-bit -> 32-bit는 애초에 동작이 되지 않기 때문에 주의해야 한다.

이 데이터 타입들의 사용되는 곳은 다음과 같다.

  • integer 타입을 pointer로 변환할 때
  • pointer 산수를 위한 변수를 선언할 때
  • 메모리 버퍼의 전체 범위를 반복하기 위한 카운터로 사용할 때
  • 32bit를 64bit로 확장하기 위해서 사용

0개의 댓글