Windows API의 reserved 파라미터는 무슨 용도?
Windows API를 사용하다 보면 간혹 reserved
라는 파라미터를 접하게 됩니다.
LONG WINAPI RegQueryValueEx(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName,
// This parameter is reserved and must be NULL.
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
이런 파라미터는 무슨 의미가 있는 걸까요?
왜 이렇게 만드는 걸까요?
첫 번째 이유는 나중에 함수의 기능이 추가되거나 쉽게 확장될 수 있도록 하기 위해서입니다.
이 추가적인 파라미터로 인해 인터페이스를 변경하지 않고도 쉽게 기능을 넣을 수 있게 됩니다.
위 함수에는 주석으로 reserved
에 반드시 NULL을 넣어야 한다고 쓰여있는데, 이렇게 해두면 추후 함수가 변경될 때 이전 클라이언트 코드들과 구분을 하기가 용이해집니다.
두 번째는 Windows 내부에서 호출하는 경우입니다.
외부에서 노출된 winapi를 사용하는 클라이언트들에게는 NULL을 넣도록 하고, 내부에서는 다른 용도로 특별한 값을 넣어서 사용하는 것입니다.
세 번째 이유는 첫 번째 이유와는 반대입니다.
처음 해당 함수가 생길 당시에는 reserved
는 다른 어떤 용도로 쓰이고 있었습니다.
시간이 지나고 해당 필드의 의미가 퇴색되고 더 이상 필요 없게 되어 버리자..
파라미터를 제거하는 대신 이름을 reserved
로 바꾸어 버린 경우입니다. 이전 코드들과의 호환성을 지켜주기 위해서.
또 다른 이유도 있습니다.
구조체에 불필요한 패딩 데이터를 포함시키지 않고 차라리 reserved
용도로 사용하려는 것.
struct IconDirectoryEntry {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
DWORD dwImageOffset;
};
4번째 필드인 bReserved
를 보면 어떤 생각이 드시나요?
그 자리를 패딩으로 채울 바에야 차라리 reserved 필드로 쓰겠다는 제작자의 의도가 명백히 보입니다.
함께 읽으면 좋은 글: