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 필드로 쓰겠다는 제작자의 의도가 명백히 보입니다.

함께 읽으면 좋은 글: