>>However once you have written a C99 compiler (using C95) you can then>>write a C99 compiler and compile it with itself (after the first>>compilation using the C99 compiler written in C95)>>> Thanks you all for your replies. Chris, this is making me> confused. Does your quote mean that I would have to write two> compilers? One compiler in C95 and one in C99? So the first would> accept C99, the second in C99 is then fed into the first?

Consider two aspects: the language to compile, and the compiler itself.

With regards to the language you may want to retain backwards
compatibility, or multiple "idioms" of the language, which may be
selectable by command line switches. This part can grow or shrink,
whatever functionality you want to put into, or remove from, your
concrete compiler. The lexer/parser may be implemented for C99, with
conditional branches in the semantic code to reject or allow for the
recognition of the C95/C99 or any sooner (or later) language specs. A
parser frequently will accept more (syntactic) constructs, whereas the
exact language specification (including semantics) will be implemented
by semantic code only.

The compiler itself may not profit from new language features, so that
this code can stay in the old (C95) version - provided backwards
compatibility of the language specs.