1

重いコードの置換を行うためのツール、正規表現、またはその他の魔法を探しています。

new理想的には、演算子のすべてのインスタンスを、引数を保持する関数の呼び出しに置き換えることができます。

私のオプションは何ですか?

アップデート:

例:

ClassA* a = new ClassA<int>(1,2,3,4,new ClassB(1,2),"horrible");

次のように変換する必要があります。

ClassA* a = FUNCTION(ClassA<int>(1,2,3,4,FUNCTION(ClassB(1,2)),"horrible"));

FUNCTION は次のようなことを行います。

FUNCTION(...) Debug(new __VA_ARGS__, __FILE__)

単純な置換でほとんどうまくいきますが、最後の).

アップデート:

私の最初の考えは、マクロを使用して のような追加情報を追跡__FILE__し、それを std コンテナーに保存してから new を呼び出すことでした。コンテナが new を呼び出すとどうなりますか? __FILE__オーバーロードされた new 内に追加するにはどうすればよいですか?

4

2 に答える 2

2

なぜこれをしたいのかについては言及していませんが、 new 演算子をオーバーロードすることがより良い選択肢になるのではないかと思います。

デフォルトの new および delete 演算子を置き換えるのはなぜですか?

編集

次のリンクも関連する可能性があります。

C ++でのnewとdeleteのオーバーロード

発信者に関する「新しい」データとログ データのオーバーライド

C++ 演算子 new を置き換えるマクロ

http://blogs.msdn.com/b/calvin_hsia/archive/2009/01/19/9341632.aspx

これは、多くの人が以前に取り組んだ問題のようです。グーグルで検索するoverload|override new __line__ __file__と、さらに可能性が広がります。

于 2013-01-31T08:25:42.500 に答える
1

より実行可能なオプションのいくつか:

ファイルが数個しかない場合は、IDE でそれらを調べて、CTRL + H を使用して検索して置換することができます (Mark Garcia に感謝します)。

多くのファイルがある場合は、正規表現を見つけて置換する Perl スクリプトを作成できます (正規表現が非常に簡単であることがわかったため、Perl のみをお勧めします)。これは実際には 1 行で実行できます。

perl -p -i -e 's/oldstring/newstring/g' `find ./ -name *.cpp`

これをコマンド ラインから実行すると、現在のディレクトリ内のすべての .cpp ファイルで、oldstring のすべてのインスタンスが newstring に置き換えられます。正直なところ、'new' のすべてのインスタンスを別の単一の文字列に単純に置き換える場合、これはおそらく多くのファイルにとって最も簡単な方法です。このような状況はほとんどありませんが、古い文字列をいつでも好きなように変更できます (「新しいオブジェクト」を createObject に置き換えるなど)。

于 2013-01-31T07:52:26.140 に答える