operator new() を定義してビルドしたら、ソース上は全く問題ないのにエラーが出たという経験無いですか?
これは以下のマクロが定義されているからです。
#define new new(__FILE__, __LINE__)
デバッグのために new をマクロに置き換えて使用するケースがよくあるので、これのせいでエラーが出ることがあるのです。
対処方法は、一度 #undef してから再度 #define することになると思います。
#undef new
void* operator new() { ... }
#define new new(__FILE__, __LINE__)
しかし、operator new() の後ろで再度 new マクロを定義しているのはあまり良いとは言えません。
例えば new マクロは必ず上記の内容になってるとは限らず、実は他の人が new(__FILE__, __LINE__, __FUNCTION__) としているかもしれませんし、後でそうするかもしれません。
再定義する側は細心の注意を払って、ほんとにそれが一致しているかどうかを調べ、そしてそれが変更されていないかどうかを定期的にチェックする必要があるのです。
しかしそんな手間は普通は掛けたくありません。
この問題を解決するのが、push_macro, pop_macro です。
これはマクロを一時的に保存し、それを取り出すことが出来ます。
#pragma push_macro("new")
#undef new
void* operator new() { ... }
#pragma pop_macro("new")
こうすれば、new が何であるかを深く考える必要無く #undef することが出来ます。
#pragma ってほんといろいろ便利な機能がありますね。