MS의 구조체 중에는 첫번째 인자가 구조체의 사이즈인 경우가 많습니다.
흔히 사용하는 CreateProcess의 STARTUPINFO구조체를 예로 들자면... STARTUPINFO StartupInfo;
ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
이런 식의 코드로 초기화하는 경우가 많죠.
이걸 한 줄로 쓸 수 있습니다. STARTUPINFO StartupInfo = { sizeof(STARTUPINFO) };
이렇게 쓰면 되죠. 멋있죠? STARTUPINFO si = { sizeof(si) };
이렇게 써도 됩니다.
왜 이게 가능하냐면...
C나 C++이 배열이나 구조체를 초기화하는 것이 가능합니다.
그런데 중간까지만 초기화를 하면 나머지는 자동으로 0으로 됩니다.
물론 위의 코드는 첫번째 인자가 cbSize인 경우에만 가능하겠죠.
(그러니까... MS의 사이즈 쓰는 구조체는 거의 다 될겁니다.)
위처럼 구조체에 사용하셔도 되고, 배열도 마찬가지로 일부만 초기화하면 나머지가 0이 됩니다.
참고로 CHARFORMAT2에 대해서 사용했더니 안되더군요. struct CHARFORMAT2A : _charformat
{
WORD wWeight;
SHORT sSpacing;
COLORREF crBackColor;
LCID lcid;
DWORD dwReserved;
SHORT sStyle;
WORD wKerning;
BYTE bUnderlineType;
BYTE bAnimation;
BYTE bRevAuthor;
};
CHARFORMAT2가 c++에서는 CHARFORMAT를 계승한 클래스로 정의되기 때문입니다. 다음과 같은 에러가 나죠.
error C2552: cf : non-aggregates cannot be initialized with initializer list
ps. 또는 구조체를 계승하고 생성자에서 첫번째 인자를 채워주는 클래스를 만들기도 하지요. 이것도 꽤 폼납니다. ^^
'Programming > C / C++' 카테고리의 다른 글
가변 인수 (0) | 2015.02.07 |
---|---|
STL without warnings (0) | 2015.02.07 |
자료형의 종류와 범위 (0) | 2015.02.07 |
__IN & __OUT (0) | 2015.02.07 |
strncpy 의 함정 (0) | 2015.02.07 |