부록 D — 더 읽을거리와 도구, 그리고 표준 문서
이 책 다음에 무엇을 읽을 것인가. 답하기 전에 이 언어의 사정을 하나 짚어 두어야 한다. C는 입문서 다음 칸이 얇고, 그나마도 오래된 언어다.
C++ 쪽은 사정이 다르다. 큰 응용을 C++로 짜는 자리가 많다 보니 입문서 위로 중급서·설계서·관용구 모음이 층층이 쌓여 있다. 반면 C에서 그 칸을 오래 지켜 온 책들은 대개 1990년대의 고전이라 C99 이후의 변화가 반영되어 있지 않다. 게다가 그 칸을 실제로 메우는 책의 상당수는 “중급 C” 책이 아니라 시스템 프로그래밍 책이다 — 유닉스 시스템 호출, 운영체제, 컴퓨터 구조. C 입문을 뗀 독자가 다음에 집는 것이 대체로 그쪽이라, 이어지는 길이 있기는 하되 스스로 찾아 나서야 한다.
이 책이 굳이 컴퓨터 이야기부터 시작해 계약과 라이브러리 설계까지 온 것도 그 사정을 의식했기 때문이다.
책과 표준 문서만이 아니라, 브라우저에서 바로 돌려 보는 도구와 연습할 곳까지 이 부록에 함께 모았다.
다행히 최근 몇 해 사이 이 칸을 메우는 책들이 나오고 있다. C11 이후의 변화와 C23의 확정이 새 책을 쓸 이유를 만들어 준 덕이다. 아래는 그중 읽어 볼 만한 것들이다.
플랫폼 노트. 이 부록의 서지 표기
아래의 서지 사항은 전산 분야에서 널리 쓰이는 ACM 참고문헌 서식(ACM Reference Format)을 따른다 — 저자. 연도. 제목 (판). 출판사, 지역. 식별자(ISBN·DOI·URL) 순이다. IEEE 서식을 쓰는 학회도 많지만, 표기 순서만 다를 뿐 담는 항목은 같다.
세 가지를 눈여겨보면 인용을 읽는 눈이 생긴다. 판(edition)이 표시된다 — 같은 제목이라도 판이 다르면 다른 책이다(C 교재에서는 특히 그렇다). 연도는 그 판의 연도다. 그리고 식별자를 적는다 — 제목은 겹치지만 ISBN·DOI 는 겹치지 않는다.
옌스 구스테트, 『모던 C』 — 표준을 기준으로 삼는 교재
저자 옌스 구스테트(Jens Gustedt)는 프랑스 INRIA의 연구책임자이자 C 표준 위원회(ISO WG14)의 위원으로, C17(ISO/IEC 9899:2018)의 공동 편집자로 참여한 사람이다. 즉 표준 문서를 만드는 쪽에서 쓴 교재다.
내용은 난이도를 0에서 3까지 층으로 나누어, 기초부터 시작해 스레드와 원자적 연산, 메모리 일관성 모형까지 올라간다. 오래된 관행 대신 오늘의 표준을 기본값으로 삼는다는 점에서 이 책과 방향이 같고, 깊이는 훨씬 깊다. “C의 바이블”이라는 자리는 전통적으로 K&R의 것이지만, 오늘의 표준을 기준으로 한 단권 교재로는 현재 이만한 것이 없다.
두 가지를 함께 알아 두면 좋다. 첫째, 한국어판(길벗, 2022)은 원서 2판을 옮긴 것이라 C17까지를 다룬다. C23을 다루는 것은 2024년에 나온 원서 3판이다. 둘째, 저자가 이 책의 전자판을 무료로 공개해 두었다 — INRIA의 공개 저장소(HAL)에서 받을 수 있다. 번역서를 읽다가 표현이 걸리거나 C23의 최신 내용이 필요하면 원서를 함께 펴 보는 방법이 있다는 뜻이다.
서지.
- Jens Gustedt. 2019. Modern C (2nd. ed.). Manning Publications, Shelter Island, NY. ISBN 978-1-61729-581-2.
- Jens Gustedt. 2024. Modern C (3rd. ed.). Manning Publications, Shelter Island, NY. ISBN 978-1-63343-777-7. — C23을 다루는 판.
- 한국어판: 옌스 구스테트. 2022. 『모던 C』(2판 번역). 길벗, 서울.
- 저자가 공개한 전자판:
gustedt.gitlabpages.inria.fr/modern-c/(INRIA 의 공개 저장소 HAL 에도 올라와 있다). - 출판사 소개면:
manning.com/books/modern-c
K. N. 킹, C Programming: A Modern Approach — 정통 교과서
이 목록에서 유일하게 정식 한국어판이 없는 책인데도 넣는 이유는, 영어권 에서 C 교재의 표준으로 통할 만큼 널리 쓰여 왔기 때문이다. 대학 교재로 자리 잡은 책이고, 개념을 한 번에 쏟지 않고 여러 번에 걸쳐 조금씩 깊게 되돌아오는 나선형 구성이 특징이다(이 책이 택한 방식과 같다). 설명이 차분하고 예제가 정직해서, 입문서를 뗀 뒤 기초를 다시 탄탄히 다지고 싶을 때 좋은 선택이다.
2판(2008)이 C89와 C99를 기준으로 삼는다는 점은 알고 읽어야 한다. 다만 이 “오래됨”은 상황에 따라 장점이 되기도 한다 — 실무에서 C99까지만 허용하는 오래된 코드베이스나 임베디드 도구 체인을 다뤄야 한다면, 그 세계를 정확히 기준으로 삼은 책이 오히려 맞다.
서지.
- K. N. King. 2008. C Programming: A Modern Approach (2nd. ed.). W. W. Norton & Company, New York, NY. ISBN 978-0-393-97950-3.
- 저자가 운영하는 책 소개면:
knking.com/books/c2/— 예제 소스와 정오표가 있다(이 책을 쓰는 시점에 HTTPS 가 아니라 HTTP 로만 열린다).
크리스토퍼 프레셰른, 『우아한 C언어 코딩 패턴』 — 설계와 패턴
원서는 오라일리에서 2022년에 나온 Fluent C: Principles, Practices, and Patterns다. 이 책이 다루는 것은 문법이 아니라 구조에 대한 결정이다 — 에러를 어떻게 돌려줄 것인가, 소유권과 수명을 어떻게 표시할 것인가, 유연한 인터페이스와 반복자를 어떻게 설계할 것인가. 이 책 제12부에서 계약이라는 이름으로 다룬 문제들이, 거기서는 패턴 목록의 형태로 정리되어 있다.
C를 배운 뒤 “이제 이걸로 뭘 어떻게 짜야 하지”라는 자리에서 막히는 독자 에게 특히 맞다. 다만 평가가 갈리는 지점도 있다. 영어권 서평들은 공통적으로 입문자용이 아니라는 점을 강조한다 — 비자명한 프로그램을 하나쯤 써 본 뒤에 읽어야 값이 나온다는 것이다. 개발자 단체 ACCU의 서평은 “조건부 추천”을 주면서, 에러 처리에 두 장을 쓰면서도 시험(test)을 다루지 않는 점과 일부 패턴(지연 정리 같은)의 적절성에 의문을 제기했다. 패턴 목록을 규범이 아니라 선택지의 목록으로 읽으면 그 지적을 감안하고도 얻을 것이 많다.
서지.
- Christopher Preschern. 2022. Fluent C: Principles, Practices, and Patterns. O’Reilly Media, Sebastopol, CA. ISBN 978-1-4920-9733-4.
- 한국어판: 크리스토퍼 프레셰른. 2023. 『우아한 C언어 코딩 패턴』. 한빛미디어, 서울.
- 출판사 소개면:
oreilly.com
온라인 참고서
주소부터 적어 둔다.
| 무엇 | 주소 |
|---|---|
| cppreference 의 C 항목 | en.cppreference.com/w/c |
| GCC 매뉴얼(옵션·경고·확장) | gcc.gnu.org/onlinedocs/ |
| Clang 문서 | clang.llvm.org/docs/ |
| MSVC 문서 | learn.microsoft.com/cpp/ |
| WG14(표준 위원회) 문서 | open-std.org/jtc1/sc22/wg14/ |
| 무료 초안 내려받기 | open-std.org/jtc1/sc22/wg14/www/docs/ (예: n3220.pdf) |
| ISO 온라인 스토어 | iso.org |
| 한국표준정보망(KSSN) | kssn.net |
표 98.1
cppreference.com의 C 항목이 사실상의 표준 레퍼런스다. 함수마다 어느 표준판에서 들어왔고 무엇이 바뀌었는지가 표시되어 있어, 이 책이 강조한 “판이 여럿인 언어”를 다루기에 알맞다. 컴파일러별 지원 현황과 경고 옵션은 GCC·Clang의 공식 문서가 가장 정확하다.
브라우저에서 바로 돌려 보는 곳
| 이름 | 무엇을 주는가 | 특히 좋은 자리 |
|---|---|---|
Compiler Explorer (godbolt.org) | 소스와 어셈블리를 나란히. C 컴파일러 판본이 천 개가 넘고, 여러 컴파일러를 동시에 견줄 수 있다 | 최적화가 무엇을 지웠는지 보기(13장), 판마다 다른 동작 확인(16장) |
OnlineGDB (onlinegdb.com) | 편집·실행·디버깅. 중단점과 변수 보기가 브라우저 안에 있다 | 디버거를 설치 전에 먼저 익히기(17장) |
Wandbox (wandbox.org) | 컴파일러 판을 골라 실행. 여러 파일도 된다 | 「내 컴파일러에서만 되는 코드」 가려내기 |
Coliru (coliru.stacked-crooked.com) | 명령줄을 직접 적어 컴파일. 군더더기가 없다 | 옵션을 바꿔 가며 경고를 관찰 |
Replit (replit.com) | 파일 여럿과 터미널이 있는 작업 공간. 계정이 필요하다 | 여러 파일로 나눈 예제(54장) |
TIO (tio.run) | 수십 개 언어를 한 자리에서. 짧은 코드 비교에 좋다 | 다른 언어와 같은 일을 견주어 보기 |
표 98.2
눈으로 보는 도구
| 이름 | 보여 주는 것 | 연결되는 장 |
|---|---|---|
Python Tutor의 C 모드 (pythontutor.com/c.html) | 실행을 한 줄씩 세우고 스택·힙·포인터를 그림으로 | 35장~45장(포인터·배열·수명·동적 메모리) |
| Compiler Explorer | 소스 줄과 기계어 줄의 대응 | 13장(최적화), 49장(연산자가 무엇이 되는가) |
cdecl.org | 복잡한 선언을 사람 말로 풀기 | 60장(선언 읽는 법) |
| Godbolt의 실행 창 | 같은 코드의 출력과 종료 상태 | 53장(종료 상태) |
표 98.3
시각화 도구는 작은 코드에 쓸 때 값이 크다. 20~30줄을 넘어가면 그림이 복잡해져 오히려 읽기 어렵다. 「포인터 하나가 어디를 가리키는가」처럼 물음이 좁을수록 잘 듣는다.
문제를 주는 곳
이 책 다음에 필요한 것은 직접 써 보는 일이다. 성격이 꽤 다르므로 목적에 맞춰 고른다.
| 이름 | 성격 | C를 배우는 사람에게 |
|---|---|---|
Exercism (exercism.org) | 작은 과제를 풀고 사람에게 첨삭을 받는다. C 트랙이 있다 | 문법을 뗀 직후에 가장 잘 맞는다 |
Advent of Code (adventofcode.com) | 12월에 매일 하나씩 나오는 퍼즐. 언어는 자유 | 입력 파싱과 자료구조 연습에 좋다 |
Codewars (codewars.com) | 난이도별 짧은 문제. 남의 풀이를 볼 수 있다 | 짧은 함수 하나를 다듬는 훈련 |
| HackerRank·LeetCode | 면접 대비 문제 은행 | 알고리즘 위주. C 자체 학습과는 결이 다르다 |
| Project Euler | 수학 문제를 프로그램으로 | 정수 넘침(27·75장)을 몸으로 겪게 된다 |
표 98.4
문. 문제 사이트만 풀면 C를 잘하게 되는가?
답. 절반만 자란다. 문제 사이트의 코드는 대개 짧고, 혼자 쓰고, 입력이 정해져 있고, 오늘 밤이면 버린다. 그 조건에서는 이 책이 강조한 것들 — 수명 관리, 소유권, 오류 경로, 인터페이스 설계 — 이 거의 필요 없다.
그래서 두 가지를 함께 하는 편이 낫다. 하나는 짧은 문제로 문법과 알고리즘의 손을 푸는 일, 다른 하나는 끝까지 만들어 보는 작은 프로그램 하나다. 후자가 없으면 「돌아가는 코드」와 「남에게 넘길 수 있는 코드」의 차이를 만날 일이 없다. 뒤쪽의 감각은 제12부(proven)와 94장 실전의 C가 다루는 자리이기도 하다.
무료로 읽을 수 있는 자료
| 자료 | 무엇 | 비고 |
|---|---|---|
cppreference의 C 항목 (en.cppreference.com/w/c) | 사실상의 표준 레퍼런스 | 함수마다 도입된 표준판이 표시된다 |
Beej’s Guide to C Programming (beej.us) | 가볍게 읽히는 무료 입문서 | 같은 저자의 네트워크 프로그래밍 안내서가 더 유명하다 |
| 옌스 구스테트, 『Modern C』 | 저자가 무료 PDF를 공개해 둔 중급 교재 | 부록 D에서 다룬 그 책이다 |
comp.lang.c FAQ (c-faq.com) | 1990년대 뉴스그룹이 정리한 질문 모음 | 오래됐지만 「왜 그런가」의 답이 많다. 특히 포인터·배열 |
| SEI CERT C Coding Standard | 보안 관점의 규칙 모음 | 규칙마다 위반 예와 준수 예가 짝으로 있다 |
WG14 문서 (open-std.org) | 표준 초안과 제안서 | 부록 D의 「표준 문서를 구하는 법」 참고 |
| GCC·Clang 공식 문서 | 경고 옵션과 확장의 정확한 근거 | 「이 경고가 무슨 뜻인가」의 1차 자료 |
표 98.5
자료를 고르는 눈 — 오래된 것을 가려내기
C는 판이 여럿인 언어이고(16장), 인터넷에는 1990년대의 글이 그대로 살아 있다. 좋은 자료와 낡은 자료를 가르는 신호가 몇 개 있다. 아래 중 하나라도 보이면 그 자료는 최소 20년 전의 관행이라고 보면 된다.
| 이런 것이 보이면 | 왜 낡았는가 |
|---|---|
void main() | 표준이 정한 적 없는 형태다(53장) |
gets(buf) | C11에서 아예 삭제됐다. 안전하게 쓸 방법이 없는 함수였다 |
malloc의 반환을 캐스트 | C에서는 불필요하고, 헤더 누락을 가린다(45장) |
#include <conio.h>·clrscr() | 옛 도스 컴파일러(터보 C)의 것이다 |
int 를 생략한 선언(f(x) int x; { }) | K&R 시절 문법. C23에서 완전히 사라졌다(24장) |
| 「포인터는 정수다」식 설명 | 프로버넌스와 정렬을 무시한 설명이다(37장) |
char 가 언제나 부호 있다는 전제 | 구현 정의다(27·67장) |
표 98.6
반대로 믿을 만한 신호도 있다 — 어느 표준판을 기준으로 말하는지 밝히고, 정의되지 않은 동작을 정의되지 않은 동작이라 부르고, 컴파일러 경고를 켠 상태의 출력을 함께 보여 주는 자료다.
실제 사례. 검색 결과 첫 줄이 가장 위험할 때
「C 문자열 입력」 같은 것을 검색하면 상위에 gets를 쓰는 예제가 지금도 나온다. 그 페이지들이 상위에 있는 이유는 옳아서가 아니라 오래되어 링크가 많이 쌓였기 때문이다. C처럼 나이 많은 언어에서는 검색 순위와 정확성의 상관이 특히 약하다.
실무의 요령은 이렇다 — 레퍼런스를 먼저 보고(cppreference), 그다음 예제를 찾는다. 순서를 뒤집으면 낡은 관행을 먼저 배운 뒤에 고치게 된다. AI에게 물을 때도 같다: 답을 그대로 쓰기 전에 표준 레퍼런스에서 그 함수의 항목을 확인하는 편이 빠르다.
표준 문서를 구하는 법
이 책은 표준을 “계약서”라 불러 왔다. 그 계약서는 실제로 살 수 있는 물건이고, 사지 않고 읽을 수 있는 길도 따로 있다.
정식 표준을 사는 길. C의 현재 표준은 ISO/IEC 9899:2024(C23)이고, 2024년 10월에 발행됐다. ISO 온라인 스토어에서 PDF로 즉시 구매할 수 있으며 가격은 200 스위스 프랑대다(개정판이 나오면 문서 번호와 가격이 바뀐다). 각국 표준화 기관을 통해 사는 방법도 있는데, 한국에서는 한국표준협회가 운영하는 한국표준정보망(KSSN)에서 ISO·IEC 표준을 검색해 구매할 수 있다. 미국은 ANSI 웹스토어가 같은 역할을 한다. 어느 경로로 사든 내용은 같다.
이전 판들도 각각의 번호로 팔린다 — C17은 ISO/IEC 9899:2018, C11은 9899:2011, C99는 9899:1999다. 오래된 코드베이스의 기준 판을 확인해야 할 때 쓸모가 있다.
무료 초안을 받는 길. 실무에서 훨씬 자주 쓰이는 쪽이 이것이다. 표준 위원회(ISO/IEC JTC1/SC22/WG14)는 작업 문서를 공개 저장소에 올려 둔다. 이 초안들은 “발행된 표준”이 아니다 — 이것부터 못박아 두자.
C99·C11·C17 은 사정이 단순하다. 발행 직전의 마지막 작업 초안(N1256·N1570· N2176)이 최종 표준과 사실상 같아서, 표준 문서 자체를 인용해야 하는 경우가 아니라면 그 초안으로 충분하다.
C23 은 다르다. 널리 쓰이는 N3220 은 C23 발행 직전의 초안이 아니라, C23 이 발행된 뒤에 나온 다음 판(C2y)의 초기 작업 초안이다 — C23 에 편집상 수정을 얹은 문서다. 내용이 C23 과 매우 가까워 실무에서 널리 참조되지만, 정확한 인용이 필요하면 발행된 ISO/IEC 9899:2024 를 근거로 삼아야 한다.
| 표준판 | 정식 번호 | 무료 초안 |
|---|---|---|
| C23 | ISO/IEC 9899:2024 | N3220 (엄밀히는 C23 직후의 작업 초안) |
| C17 | ISO/IEC 9899:2018 | N2176 |
| C11 | ISO/IEC 9899:2011 | N1570 |
| C99 | ISO/IEC 9899:1999 | N1256 (정오표 반영판) |
표 98.7
받는 곳은 WG14의 문서 목록이다 — open-std.org 아래 jtc1/sc22/wg14/www/docs/에 문서 번호 그대로 올라와 있다(예를 들어 C23 초안은 n3220.pdf다). 같은 자리에 결함 보고서와 제안서들도 쌓여 있어서, “이 조항이 왜 이렇게 되었나”를 추적할 때 요긴하다.
읽는 요령. 표준 문서는 앞에서부터 읽는 책이 아니라 찾아보는 책이다. 목차와 색인으로 조항을 찾고, 그 조항의 문장만 정확히 읽는 것이 정석이다. 읽을 때 도움이 되는 규약이 몇 가지 있다.
- “shall”은 요구, “shall not”은 금지다. 제약 조항의 shall을 어기면 진단(diagnostic)이 나오고, 제약 밖의 shall을 어기면 정의되지 않은 동작이다(52장).
- 부록 J에 정의되지 않은 동작·미지정 동작·구현 정의 동작의 목록이 모여 있다. 52장에서 다룬 세 회색지대를 한꺼번에 훑어보기 좋은 자리다.
- 각 조항 끝의 “EXAMPLE”과 각주는 규범이 아니라 설명이다. 다투는 자리 에서는 본문 문장이 기준이다.
이 책 다음의 길
정리하면 세 갈래다.
- 더 읽는다 — 부록 D의 책들과 위의 무료 자료. 표준 문서를 직접 여는 습관까지.
- 더 써 본다 — 문제 사이트로 손을 풀고, 작은 프로그램 하나를 끝까지 만든다.
- 더 깊이 본다 — 94장 실전의 C가 가리키는 영역들(시스템 프로그래밍, 임베디드, 성능)과 제12부가 보여 준 라이브러리 설계.
이 책이 목표한 것은 그 셋의 바닥이었다. 바닥이 단단하면 어느 갈래로 가든 덜 흔들린다.