#define と typedef

#define と typedef の違いは、プリプロセッサレベルで展開されるか、コンパイラレベルで展開されるかぐらいの違いだと思ってた。


しかし、

#define pvoid void*
void f( const pvoid ){}
void main(){
    f( (const void*)0 );
}

これは OK。
でも、

typedef void* pvoid;
void f( const pvoid ){}
void main(){
    f( (const void*)0 );
}

これは NG!


なんでかってのを考えてみると、

typedef void* pvoid;

この宣言によって、void* を一つの型とするので、pvoidというユーザ定義のデータ型が void* になり、(コンパイラら見て)データ型である void* そのものが const になる……のかな?


だからこの場合、

    f( (void* const)0 );

こうしないといけないらしい。