のすべての形式を、operator new
追加の引数を含むオーバーロードに置き換えるマクロを作成することは可能ですか?__FILE__
__LINE__
問題はoperator new
、括弧の有無にかかわらずコーディングできるように思われるため、次のとおりです。
オブジェクトのようなマクロ:
#define new new(__FILE__, __LINE__)
次のような宣言を置き換えます。
A* a = new A();
および関数のようなマクロ:
#define new(A) new (A, __FILE__, __LINE__)
次のような宣言を置き換えます。
A* a = new(std::nothrow) A();
残念ながら、同じ識別子で2 つのマクロを宣言しようとすると、型が異なっていてもエラーになるため、次の例では失敗します。
#define new new(__FILE__, __LINE__)
#define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
私は g++ を使用しているので、可変引数マクロの構文を使用すると成功することを期待していましたが、残念ながらそうではありませんでした。以下:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
のみ一致new(xyx) A()
し、一致しませんnew A()
。
なぜそれが不可能なのかについてのエッセイが書かれていることは知っていますが、私は非常に近いので、方法があるに違いないと感じています. 私が行方不明であることは明らかですか?