Incidentally, if you want to run the preprocessor in GCC explicity, you can pass it the -E option-- say
gcc -E filename
and it will run the preprocessor on filename and print the processed material to screen (you can capture it to file using > if you want) without actually going and attempting to compile any C.

This is useful if you want to use things like #include and #define in environments other than C-- for example, if you are writing Perl or poetry. Preprocessor Directives really are a little language unto themselves (someone even wrote a program that prints out 99 bottles of beer using nothing except them..), and are really no more particularly useful as a part of C than they are as a part of anything else. Also, since most of the IOCCC entries rely heavily on preprocessing for their obfuscation, running the preprocessor on them and looking at the resulting code generally makes things a lot clearer.