지금 이 순간에도 무수한 프로그래밍 언어가 새롭게 만들어지고 있으며, 한때 많은 이들의 관심 속에 승승장구하던 언어 중 일부는 이제 그 흔적조차 찾기 어렵게 되었다. 이런 냉혹한 현실 속에서도 지금까지 널리 사용되고 있는 언어 중 하나가 바로 C이다.
C 언어가 이렇게 많은 사람들로부터 오랫동안 사랑받아 온 가장 큰 이유는 고수준 언어이면서도 하드웨어까지 다룰 수 있는 저수준 언어의 특징을 가지고 있다는 것, 그리고 C가 제공하는 놀라운 융통성 때문이다. 그러나 C의 강점이자 최대 무기인 이런 특징들 때문에 수많은 C 프로그래머들이 프로그래밍 도중 혼란에 빠지거나 똑같은 실수를 반복하며 버그를 만들어내기도 한다. 『C 함정과 실수』는 바로 이런 함정에 빠지기 쉬운 프로그래머들을 위한 책이다. 많은 C 프로그래머들이 지금까지 저질렀던 실수와 C 언어의 함정을 일목요연하게 정리한 이 책은 C 언어로 프로그램을 작성하는 사람이라면 누구나 한 번쯤 읽어 보아야 할 필독서라 할 수 있다.
『C 함정과 실수』는 여덟 개의 장과 부록으로 구성되어 있다. 처음 세 개 장에서는 어휘론적, 구문론적, 의미론적 오류를 다루며, 그 다음 이어지는 장부터는 링키지로 인한 오류, 라이브러리 함수에서의 유의 사항, 전처리기 오류, 이식성 문제 등을 설명한다. 8장에서는 앞선 일곱 개 장에서 제시한 연습문제에 대한 해답을 제공한다. 마지막으로 부록에서는 printf 계열 함수에 대한 자세한 내용과 더불어 가변 인수를 처리하기 위해 사용해야 하는 varargs 함수 및 stdarg 함수를 설명한다.
『C 함정과 실수』에서 사용한 C의 표준은 ANSI C이다. 현재 C99 표준까지 발표되었으나 기본적으로 ANSI C 표준에서 크게 벗어나지 않는다. 이 책은 특히 오래된 컴파일러 환경에서 작성된 C 레거시 프로그램을 현재의 컴파일러 환경으로 옮기려고 할 때 주의해야 할 점을 상세히 설명하고 있으므로, 이런 작업을 수행하는 사람이라면 반드시 읽어 보아야 한다.
책의 내용이 아무리 좋다 하더라도 예제 코드를 잘 이해하고 그것을 실제로 작성하여 실행해 보지 않는다면 온전한 나의 것이 되지 않을 뿐더러 이를 실전에 사용하기도 힘들 것이다. 그러므로 항상 예제 코드를 직접 타이핑하는 습관을 들여 산지식으로 만들기 바란다. 그렇게만 된다면, C 언어는 더 이상 정복하기 어려운 혹은 다루기 어려운 언어가 아닌 고수준과 저수준을 넘나들며 프로그래밍할 수 있는 훌륭한 도구이자 프로그래밍의 자유를 만끽할 수 있는 그런 언어가 될 것임에 틀림없다.
마지막으로, 지금의 역자를 있게 해준 부모님께 감사드린다. 못난 자식 뒷바라지에 마음보다 몸이 먼저 늙으신 부모님께 작으나마 이 책을 바친다. 또한, 숱한 원고 재촉에도 끄떡없이 버틴 역자를 너그러이 용서해 준 피어슨에듀케이션코리아 편집부 여러분께 감사드리며, 무엇보다 이 책을 통해 C 언어를 더욱더 빛내 줄 독자 여러분께 감사드린다.
편하고 능숙하게 사용하기까지 상당한 경험이 있어야 하는 도구를 배우는 일이란 결코 쉽지 않다. 처녀비행을 나선 예비비행사는 비행기를 제대로 제어하지 못해 롤러코스터로 만들게 된다. 이런 과정은 비행의 섬세함과 부드러움을 이해할 때까지 계속된다. 좀더 쉽긴 하지만 자전거의 경우도 배우는 과정은 별반 다르지 않다.
프로그래밍 언어를 배우는 것도 마찬가지다. 어떤 프로그래밍 언어든지, 그 언어에 익숙하지 못한 경우에는 문제가 발생할 여지가 크다. 발생하는 문제는 프로그래밍 언어마다 다르지만, 놀랍게도 프로그래머들은 유사한 실수를 반복하여 비슷한 문제를 만들어 내곤 한다. 이 책은 이런 문제들을 모아 보고자 하는 의도에서 기획되었다.
이러한 시도가 처음 이루어졌던 시기는 1977년이었다. 워싱턴 DC의 SHARE (IBM 메인프레임 사용자 모임) 미팅에서 이를 『PL/I 함정과 실수(PL/I Traps and Pitfalls)』라고 이름 붙였다. 얼마 후에, 필자는 PL/I 사용자가 많은 콜롬비아대학교에서 C 사용자가 많은 AT&T 벨연구소로 자리를 옮기게 되었는데, 여기서 근무하는 10년 동안, 필자를 포함한 C 프로그래머들이 자신이 해야 할 일이 무엇인지 정확히 파악하지 못했을 때 어떠한 곤경에 빠지는지를 수없이 보았다.
1985년에 C의 문제점을 수집하기 시작했으며, 그 해 말쯤 그것을 AT&T 내부 논문으로 작성하였다. 이 논문에 대한 반응은 너무나도 당혹스러웠다. 벨연구소 도서관에서 이 문서를 2,000명이 넘는 사람들이 복사했던 것이다.
이 책은 이런 것이다!
『C 함정과 실수(C Traps and Pitfalls)』는 다른 프로그래머(전문가 포함)들이 어떻게 곤경에 빠지게 되는지 보여줌으로써 방어적 프로그래밍을 하도록 만드는 데 그 목적이 있다. 이런 실수는 일단 눈으로 보면서 이해하고 나면 쉽게 피할 수 있으므로 여기서는 일반화보다는 특정 예제를 중심으로 설명한다. 정말로 C 프로그램을 제대로 작성하고 싶다면 이 책을 항상 옆에 두고 보아야 한다. 이 책의 초안을 미리 검토했던 전문 프로그래머들은 이구동성으로 “여기 나온 버그가 바로 내가 저번 주 내내 고생했던 바로 그것이다!”라고 감탄했다. 만일 여러분이 C 언어 강사라면 학생에게 추천할 만한 참고 도서 중 첫 번째가 바로 이 책일 것이다.
이 책은 이런 것이 아니다!
이 책은 C에 대한 비판을 하기 위해 씌어진 것이 아니다. 어떤 언어를 사용하든지 간에 프로그래머는 함정에 빠지고 문제에 부딪칠 수 있다. 이 책은 필자의 지난 10년간의 C 경험을 간략한 형태로 만들어서 많은 프로그래머들이 저질렀던 엉뚱한 실수를 피할 수 있도록 하기 위해 만들어진 것이다.
또한 이 책은 초보자용 서적이 아니다. 국도 변에 “운전 조심”이라는 표지판을 설치한다고 해서 모든 교통사고를 예방할 수 있는 것이 아니듯, 사용법을 안다고 해서 에러를 피할 수 있는 것은 아니다! 사람들은 자신의 경험 혹은 타인의 경험을 통해 좀더 효과적으로 학습을 할 수 있다. 특정 실수가 어떻게 일어나는지 이해하는 것만으로도 미래에 발생할 수 있는 유사한 문제를 피할 수 있는 것이다.
이 책에서는 직접 C 프로그램 작성법을 가르치지 않는다(이를 원한다면 케니헌과 리치가 집필한 『The C Programming Language, 2판』을 참조한다). 또한 레퍼런스 매뉴얼도 아니다(레퍼런스 매뉴얼을 원하다면 하비슨의 『C: A Reference Manual, 5판』을 참조한다). 그렇다고 알고리즘이나 자료구조를 논하는 것도 아니다(밴 위크의 『Data Structures and C Programs』를 참조한다). 이 책은 간략하게 C의 이식성 문제를 논하고(호톤의 『How to Wirte Portable Programs in C』를 참조한다) 운영체제 인터페이스를 설명한다(케니헌과 파이크의 『The UNIX Programming Environment』를 참조한다). 이 책에서 언급한 내용은 간략하긴 하지만 실제로 사용하는 코드이다(좀더 많은 코드를 보고 싶다면 푸어의 『The C Puzzle Book』을 참조한다). 백과사전도 아닌 이 책에서 이렇게 많은 서적을 언급한 이유는 이러한 책들이 모두 C 언어를 공부하는 데 꼭 필요하기 때문이다.
ANSI C에 대해서
이 책을 집필할 때까지는 ANSI C 표준이 완전히 발표되지 않았다. 따라서 ANSI 위원회에서 이를 공식적으로 발표할 때까지 ‘ANSI C’라고 언급하는 것은 기술적으로 말하면 잘못된 것이다. 하지만 이제 ANSI 표준은 더 이상 바뀔 것이 없을 정도로 충분히 완성된 상태이다. ANSI 위원회에서 언급한 여러 중요한 기능 향상 중 많은 부분을 이미 구현하고 있는 C 컴파일러도 많다. 만일 자신의 C 컴파일러가 ANSI 함수 구문을 지원하지 않는다고 하더라고 걱정할 필요는 없다. 어떤 버전의 C를 사용하든지 간에 예제 코드를 이해하고 문제를 파악하는 데는 별 문제가 없다.