もともと「プリプロセッサ」と「コンパイラ」は別々のプログラムだったんです。
今はメモリが豊富なので統合されてますが。

「プリプロセッサ」が処理するのは#include,#define,#ifdef,#ifなどの#〜のキーワードだけです。

で、typedefですが、これは「プリプロセッサ」のキーワードではなく「C言語コンパイラ」のキーワードです。
つまり「プリプロセッサ」の後に処理されます。
また、typedefは型を置き換えるのではなくて、型を「拡張」するために存在します。
>>652の例では、"ii"は"int"に展開されるのではなくて、intと同じ"32bit符号付整数型"として扱われます。
classやstruct、unionをtypedefした時も同じで、"32bitの(内部処理的な)ポインタ型"になります。
もし"展開"していたら、同じclassを多重定義することになってしまいます。

typedef class tag_tcls { int x; int y } T_CLS;
T_CLS a;
T_CLS b;

↓展開すると

class tag_tcls { int x; int y } a;
class tag_tcls { int x; int y } b;