C++0x で新しく追加されるユーザ定義リテラルはアンダースコアから始まってないとダメという制約がありますが、これがコンパイル時に問題にならないということは hito さんが書いています(本の虫: user defined literalが予約語の制約を無視できる理由)。 でもコンパイル時じゃなくてプリプロセス時ならどうなるの?という話です。 アンダースコア二つから始まる名前と、アンダースコアひとつに大文字から始まる名前は、当然プリプロセス時にも影響してきます。 ということは、 #define __hoge hage というのをコンパイラが予約していた場合、 "bjarne"__hoge というのをユーザが書いた場合、プリプロセス時に __hoge が置換されてしまって、意図しない結果になりそうです。 これは問題だなーとか思っていて、ぼけーっと仕様書を眺めていたのですが、こんなのを見つけま