C++ Gotchas: Avoiding Common Problems in Coding and Design, by Stephen C. Dewhurst. Copyright 2003.
Part of the AddisonWesley Professional Computing Series.
It explains 99 ways that C++ programmers can write bugs, including the problems with CeePreprocessorStatements. It makes several controversial suggestions.
Unfortunately, some of its throw-away comments are flat-out wrong. For example, the author would have been well served to have read "A HistoryOfPi?" before commenting on legislating the value of pi.
By the same author: CppCommonKnowledge.