다음을 통해 공유


Windows 코딩 규칙

Windows 프로그래밍을 처음 접하는 경우 Windows 프로그램을 처음 볼 때 당황스러울 수 있습니다. 코드는 DWORD_PTRLPRECT같은 이상한 형식 정의로 채워지고 변수에는 hWndpwsz(헝가리어 표기법이라고 함)와 같은 이름이 있습니다. Windows 코딩 규칙 중 일부를 알아보는 데 잠시 시간이 걸리는 것이 좋습니다.

대부분의 Windows API는 함수 또는 COM(구성 요소 개체 모델) 인터페이스로 구성됩니다. C++ 클래스로 제공되는 Windows API는 거의 없습니다. (주목할 만한 예외는 2차원 그래픽 API 중 하나인 GDI+입니다.)

Typedefs

Windows 헤더에는 많은 typedef가 포함되어 있습니다. 이들 중 대부분은 WinDef.h 헤더 파일에 정의되어 있습니다. 다음은 자주 만날 수 있는 몇 가지 항목입니다.

정수 형식

데이터 형식 크기 서명?
BYTE 8비트 서명되지 않음
DWORD 32비트 부호 없는
INT32 32비트 서명
INT64 64비트 서명
LONG 32비트 서명
LONGLONG 64비트 서명
UINT32 32비트 부호 없는
UINT64 64비트 부호 없는
ULONG 32비트 부호 없는
ULONGLONG 64비트 부호 없는
WORD 16비트 부호 없는

볼 수 있듯이 이러한 typedef에는 일정량의 중복성이 있습니다. 이 중 일부는 단순히 Windows API의 역사적 배경 때문입니다. 여기에 나열된 형식의 크기는 고정되어 있으며 크기는 32비트 및 64비트 애플리케이션 모두에서 동일합니다. 예를 들어 DWORD 형식은 항상 32비트 너비입니다.

부울 형식

BOOL은 C++의 bool과는 구별되며, 부울 값을 나타내는 기타 형식과도 다른, int의 형식 별칭입니다. 헤더 파일 WinDef.hBOOL에 사용할 두 값을 정의합니다.

#define FALSE    0 
#define TRUE     1

그러나 이 TRUE정의에도 불구하고 BOOL 형식을 반환하는 대부분의 함수는 0이 아닌 값을 반환하여 부울 진리를 나타낼 수 있습니다. 따라서 항상 다음을 작성해야 합니다.

// Right way.
if (SomeFunctionThatReturnsBoolean()) 
{ 
    ...
}

// or

if (SomeFunctionThatReturnsBoolean() != FALSE)
{ 
    ...
}

이것이 아닙니다.

if (result == TRUE) // Wrong!
{
    ... 
}

BOOL 정수 형식이며 C++의 부울교환할 수 없습니다.

포인터 형식

Windows는 포인터-X 다양한 형식의 데이터 형식을 정의합니다. 이름에 보통 P- 또는 LP-라는 접두사가 붙습니다. 예를 들어 LPRECTRECT대한 포인터입니다. 여기서 RECT 사각형을 설명하는 구조입니다. 다음 변수 선언은 동일합니다.

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

16비트 아키텍처(16비트 Windows)에는 2가지 유형의 포인터가 있습니다. P "포인터"에 대한 LP "긴 포인터"를 의미합니다. 현재 세그먼트 외부의 메모리 범위를 처리하기 위해 긴 포인터(원거리 포인터라고도 함)가 필요했습니다. LP 접두사는 16비트 코드를 32비트 Windows로 쉽게 이식할 수 있도록 유지되었습니다. 오늘날에는 구별이 없으며 이러한 포인터 형식은 모두 동일합니다. 이러한 접두사를 사용하지 않습니다. 또는 하나를 사용해야 하는 경우 P사용합니다.

포인터 정밀도 형식

다음 데이터 형식은 항상 포인터의 크기입니다. 즉, 32비트 애플리케이션에서는 너비가 32비트이고 64비트 애플리케이션에서는 64비트 너비입니다. 크기는 컴파일 시간에 결정됩니다. 64비트 Windows에서 32비트 애플리케이션을 실행하는 경우 이러한 데이터 형식은 여전히 4바이트 너비입니다. (64비트 애플리케이션은 32비트 Windows에서 실행할 수 없으므로 역방향 상황이 발생하지 않습니다.)

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

이러한 형식은 정수가 포인터로 캐스팅될 수 있는 경우에 사용됩니다. 포인터 산술 연산에 대한 변수를 정의하고 메모리 버퍼의 전체 바이트 범위를 반복하는 루프 카운터를 정의하는 데도 사용됩니다. 일반적으로 기존 32비트 값이 64비트 Windows에서 64비트로 확장된 위치에 표시됩니다.

헝가리어 표기법

헝가리어 표기법 변수 이름에 접두사를 추가하여 변수에 대한 추가 정보를 제공하는 방법입니다. (표기법의 발명가인 찰스 시모니는 헝가리인으로, 이 이름이 붙게 된 이유입니다).

원래 형식의 헝가리어 표기법은 변수에 대한 의미 체계 정보를 제공하여 의도한 용도를 알려 줍니다. 예를 들어 인덱스를 의미합니다. cb 바이트("바이트 수") 및 rwcol 평균 행 및 열 번호의 크기를 의미합니다. 이러한 접두사는 잘못된 컨텍스트에서 변수를 실수로 사용하지 않도록 설계되었습니다. 예를 들어, rwPosition + cbTable라는 표현을 보면 행 번호가 크기에 추가되고 있다는 것을 알 수 있습니다. 이는 거의 확실하게 코드의 버그입니다.

더 일반적인 형식의 헝가리어 표기법은 접두사를 사용하여 형식 정보를 제공합니다. 예를 들어 DWORDdw, WORD.

메모

C++ 핵심 지침은 접두사 표기법(예: 헝가리어 표기법)의 사용을 지양합니다. NL.5: 이름형식 정보를 인코딩하지 마십시오. 내부적으로 Windows 팀은 더 이상 사용하지 않습니다. 그러나 샘플 및 설명서에는 이 사용이 남아 있습니다.

다음

문자열과 작업하기