따라서 struct tm을 앞에서처럼 초기화하면 이 구조체의 일관성이 깨지게 된다. tm_wday와 tm_yday 멤버는 다른 멤버와 연결되는 값을 가지지 못한다. 다음과 같이 함수를 만들면 이 멤버의 값을 일관성 있게 설정할 수 있다.
yday.c
19 struct tm time_set_yday(struct tm t) {
20 // tm_mdayssms 1부터 시작한다.
21 t.tm_yday += DAYS_BEFORE[t.tm_mon] + t.tm_mday - 1;
22 // 윤년을 처리하는 로직
23 if ((t.tm_mon > 1) && leapyear(t.tm_year+1900))
24 ++t.tm_yday;
25 return t;
26 }
이 함수는 이전 달의 날수와 tm_mday 멤버와 윤년을 반영한 값을 이용해서 올해의 날을 계산한다. 이 함수는 현재 수준(레벨 1)에서 주목할 부분이 있다. 즉, 함수의 매개변수 중에서도 t의 멤버만 수정할 뿐 원본 오브젝트(t 자체)는 건드리지 않는다.
TAKEAWAY 6.25 struct 타입 매개변수는 값 전달 방식(pass-by-value)으로 전달된다.
변경 내역을 추적하도록 함수의 결과를 원본에 다시 대입한다.
yday.c
39 today = time_set_yday(today);