私は次のように私のC++のコードでクラスを持っている:ログC++クラスメソッドの呼び出し元(関数名、行番号)
class myClass
{
public:
void method1(int a, int b, std::string str);
};
他のクラスは、MyClassのからオブジェクトをインスタンス化し、法1を呼び出すことができます。
void caller()
{
obj1->method1(12, 4, "sample");
}
myClassのすべての呼び出し元(関数名、ファイル名、行番号)をログに記録します。考えられる解決策の1つは、
class myClass
{
public:
method1(int a, int b, std::string str, const char *_function = __builtin_FUNCTION(), const char *_file = __builtin_FILE(), int _line = __builtin_LINE());
};
デフォルトの引数として__builtin_xxxを使用しています。このソリューションは、複数の欠点があります。
- それは
- __builtin_xxx醜いソリューションであることはgccのバージョンでのみ使用可能です>私たちは
- IDEをmethod1にするために、3つのデフォルトパラメータを追加する必要が4.8
- は、上のデフォルトパラメータを示してい自動補完は、ユーザーが提供するものではありません!
別の解決策は、基本的に前の溶液に非常に類似している__LINE__
、__FILE__
と__func__
を使用しています。それらは、関数スコープの外で定義されていない、と彼らはこのように使用されるべきである:
void caller()
{
obj1->method1(12, 4, "sample", __func__, __FILE__, __LINE__);
}
Hereは、両方のソリューションの実施例です。
より良いユーザがmyClassオブジェクトでmethod1を呼び出すときに発信者を記録するソリューションはありますか。より良い解決策として、私は具体的には、3つのパラメータを追加してmethod1の宣言を変更しないことを意味します。
可能な複製の複製[C/C++は、関数呼び出しを追跡するための巧妙な方法が必要です]のように見える(https://stackoverflow.com/questions/3315248/cc-need-a -clear-way-to-track-function-calls) – user835611
マクロ解決策がパフォーマンスを犠牲にしないので、もっと良いことを明確にしたいと思うかもしれません... IDEの問題は実際にIDEの問題であり、C++の問題ではありません。あなたは何を言っていますか? –
パフォーマンスについて気にしない場合は、コールスタックを使用できます:http://stackoverflow.com/questions/3899870/print-call-stack-in-c-or-c –