#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 );
こうしないといけないらしい。