Proven C BookEnglish GitHub

부록 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의 최신 내용이 필요하면 원서를 함께 펴 보는 방법이 있다는 뜻이다.

서지.

K. N. 킹, C Programming: A Modern Approach — 정통 교과서

이 목록에서 유일하게 정식 한국어판이 없는 책인데도 넣는 이유는, 영어권 에서 C 교재의 표준으로 통할 만큼 널리 쓰여 왔기 때문이다. 대학 교재로 자리 잡은 책이고, 개념을 한 번에 쏟지 않고 여러 번에 걸쳐 조금씩 깊게 되돌아오는 나선형 구성이 특징이다(이 책이 택한 방식과 같다). 설명이 차분하고 예제가 정직해서, 입문서를 뗀 뒤 기초를 다시 탄탄히 다지고 싶을 때 좋은 선택이다.

2판(2008)이 C89와 C99를 기준으로 삼는다는 점은 알고 읽어야 한다. 다만 이 “오래됨”은 상황에 따라 장점이 되기도 한다 — 실무에서 C99까지만 허용하는 오래된 코드베이스나 임베디드 도구 체인을 다뤄야 한다면, 그 세계를 정확히 기준으로 삼은 책이 오히려 맞다.

서지.

크리스토퍼 프레셰른, 『우아한 C언어 코딩 패턴』 — 설계와 패턴

원서는 오라일리에서 2022년에 나온 Fluent C: Principles, Practices, and Patterns다. 이 책이 다루는 것은 문법이 아니라 구조에 대한 결정이다 — 에러를 어떻게 돌려줄 것인가, 소유권과 수명을 어떻게 표시할 것인가, 유연한 인터페이스와 반복자를 어떻게 설계할 것인가. 이 책 제12부에서 계약이라는 이름으로 다룬 문제들이, 거기서는 패턴 목록의 형태로 정리되어 있다.

C를 배운 뒤 “이제 이걸로 뭘 어떻게 짜야 하지”라는 자리에서 막히는 독자 에게 특히 맞다. 다만 평가가 갈리는 지점도 있다. 영어권 서평들은 공통적으로 입문자용이 아니라는 점을 강조한다 — 비자명한 프로그램을 하나쯤 써 본 뒤에 읽어야 값이 나온다는 것이다. 개발자 단체 ACCU의 서평은 “조건부 추천”을 주면서, 에러 처리에 두 장을 쓰면서도 시험(test)을 다루지 않는 점과 일부 패턴(지연 정리 같은)의 적절성에 의문을 제기했다. 패턴 목록을 규범이 아니라 선택지의 목록으로 읽으면 그 지적을 감안하고도 얻을 것이 많다.

서지.

온라인 참고서

주소부터 적어 둔다.

무엇주소
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 를 근거로 삼아야 한다.

표준판정식 번호무료 초안
C23ISO/IEC 9899:2024N3220 (엄밀히는 C23 직후의 작업 초안)
C17ISO/IEC 9899:2018N2176
C11ISO/IEC 9899:2011N1570
C99ISO/IEC 9899:1999N1256 (정오표 반영판)

표 98.7

받는 곳은 WG14의 문서 목록이다 — open-std.org 아래 jtc1/sc22/wg14/www/docs/에 문서 번호 그대로 올라와 있다(예를 들어 C23 초안은 n3220.pdf다). 같은 자리에 결함 보고서와 제안서들도 쌓여 있어서, “이 조항이 왜 이렇게 되었나”를 추적할 때 요긴하다.

읽는 요령. 표준 문서는 앞에서부터 읽는 책이 아니라 찾아보는 책이다. 목차와 색인으로 조항을 찾고, 그 조항의 문장만 정확히 읽는 것이 정석이다. 읽을 때 도움이 되는 규약이 몇 가지 있다.

이 책 다음의 길

정리하면 세 갈래다.

이 책이 목표한 것은 그 셋의 바닥이었다. 바닥이 단단하면 어느 갈래로 가든 덜 흔들린다.