Proven C BookEnglish GitHub

98 모던 C 총정리

먼저 알아야 할 것

52장 정의되지 않은 동작 · 정의되지 않은 동작
51장 오류와 계약 · 계약
96장 실전의 C · 실전의 도구

돌아보기

1장에서 이 책은 “옛 어법의 관성으로 쓰인 입문서가 아니라 오늘의 C에서 출발하는 입문서”를 표방했다. 그러면 이 책을 다 읽은 지금, 독자가 배운 C는 옛 C와 무엇이 다른가?

답. 문법의 목록이 다른 것이 아니라 기준이 다르다. 옛 어법의 책은 “이렇게 쓰면 동작한다”를 가르치고, 이 책은 “이렇게 쓰면 계약 안이다”를 가르쳤다 — 초기화하고 쓰기(23장), 경계와 크기를 함께 다루기(38장), 실패를 값으로 확인하기(51장), 계약 밖의 지름길을 피하기(52장), 도구로 검사하기(17장). C23의 새 문법들은 그 기준을 더 쉽게 지키게 해 주는 도구로 등장했다. 아래 회고가 그 목록이다.

이 장의 필요성과 맥락

마지막 장이 「모던 C 총정리」인 것은 이 책이 C23 을 따로 가르치지 않았기 때문이다. 새 표준의 기능을 특별 취급하지 않고 당연한 것처럼 써 왔으니, 마지막에 한 번 모아 「지금까지 쓴 것 중 이것들이 새것이다」라고 짚어 주어야 한다. 그것이 이 순서가 만든 빚이자, 여기서 갚는 빚이다.

이 장이 끝나면

마지막 장이다. 96장에서 실전의 지형까지 둘러보았으니, 이제 지나온 길을 정리한다. 이 책에서 자연스럽게 써 온 C23의 얼굴들을 모아 회고 하고, 모던 C의 관행을 한 장의 지침으로 정리하며, 여기서 어디로 갈 수 있는지 이야기한다. 전권 회고 문답으로 책을 닫는다.

이 장에서 답할 질문

  1. 여기서 어디로 가면 좋은가?

98.1 회고 — 이미 써 온 C23

이 책은 새 표준을 따로 소개하지 않고, 필요한 자리에서 자연스럽게 썼다. 모아 보면 이만큼이다.

C23의 것처음 만난 곳무엇을 쉽게 만들었나
bool·true·false 키워드30장헤더 없이 판단을 값으로
nullptr36장NULL의 모호함 제거
2의 보수 확정7장부호 표현의 이식성 고민 종료
[[nodiscard]]37·51장실패 확인을 잊는 실수를 컴파일러가 차단
[[fallthrough]]31장switch 폴스루의 의도를 문서로
ckd_add 계열52장오버플로를 UB가 아니라 값으로
alignof37장정렬 요구를 언어 차원에서 질의
삼중자 제거9장문자 코드 시대의 흉터 정리
va_start의 완화58장가변 인자의 군더더기 제거

표 98.1

한 방향이 보인다 — 계약을 더 명시적으로, 실수를 더 빨리 잡히게. 1장에서 “C 자신도 변화의 조짐을 보이고 있다”고 한 것의 구체적 내용이 이 표다.

98.2 모던 C 관행 — 한 장의 지침

이 책 전체를 실무 수칙으로 압축하면 이렇다.

빌드와 도구. 경고를 켠다(-Wall -Wextra). 시험 실행은 새니타이저와 함께(ASan·UBSan). 가능하면 두 컴파일러로 교차 검증한다(17장).

선언과 타입. 선언과 동시에 초기화한다. 바꾸지 않을 것은 const로 둔다. 크기가 계약인 자리에는 <stdint.h>의 고정 폭 타입을 쓴다. 크기·인덱스는 size_t 계열로 일관되게(29장의 부호 섞임 함정).

기억. 경계는 언제나 명시적으로 — 배열과 길이는 함께 다닌다. 포인터는 쓰기 전에 유효성을 확인한다. 동적 할당은 소유자를 정하고, 해제 후에는 포인터를 비운다. 가능하면 자동 수명으로 해결한다(38·45장).

오류. 실패는 값으로 알리고, 반환값은 확인한다. 내부 불변식은 assert, 바깥에서 온 것은 실행 중 검사(51장).

계약. “내 컴퓨터에서 돌았다”가 아니라 “추상 기계 위에서 옳은가”로 판단한다(12·52장).

부품. 표준 라이브러리의 계약을 알고 고르고, 반복되는 위험 지대에는 검사가 내장된 부품을 얹는다(61장·제12부).

문. 여기서 어디로 가면 좋은가?

답. 세 갈래를 권한다. 깊이 — 이 책이 문을 열어 둔 곳들: 자료구조와 알고리즘(46장의 연결 구조), 동시성(12장의 멀티코어와 C11 원자), 시스템 프로그래밍(파일·네트워크는 플랫폼 API의 세계다). 너비 — 이웃 언어들: C++·Rust·Zig를 볼 때, 이 책에서 배운 기억·계약·표현의 감각이 그대로 통역된다(1장에서 예고한 대로다). 실전 — 96장에서 이름을 든 프로젝트들의 소스를 직접 읽는 것. SQLite나 curl 같은 잘 쓰인 C 코드는 이 책의 모든 주제가 실물로 살아 있는 교재다.

그리고 표준 문서 자체가 이제 읽을 수 있는 텍스트가 되었다는 것도 기억해 둘 만하다 — “계약서”라는 관점으로 보면, 그 무뚝뚝한 문서가 왜 그렇게 쓰였는지 이해된다.

98.3 다음에 읽을 책, 그리고 표준 문서

여기서 멈추지 않을 독자를 위해 읽을거리를 따로 모아 두었다 — 부록 D가 그것이다. C는 입문서 다음 칸이 유난히 비어 있는 언어인데, 최근 몇 해 사이 그 칸을 메우는 책들이 나오고 있다. 부록에는 그 책들의 장단점과 함께, 이 책이 내내 “계약서”라 불러 온 표준 문서를 실제로 구하는 방법 (구입과 무료 초안 내려받기)을 적어 두었다.

98.4 마지막으로

이 책은 4장에서 컴퓨터를 세 부품으로 그리는 것으로 시작했다. 그 그림은 곧 정직하게 무너졌고 — 기억은 사다리가 되고, 실행은 겹쳐지고, 편집자가 끼어들었다 — 그 자리에 남은 것이 계약이었다. C를 안다는 것은 문법을 외우는 일이 아니라 그 계약을 읽을 줄 아는 일이라는 것, 이 책이 하고 싶었던 말은 그것 하나다.

읽는 것만으로 여기까지 온 독자에게, 이제 남은 것은 하나뿐이다 — 읽은 것을 자기 코드로 써 보는 것. 좋은 여정이 되기를.