2017-10-01 36 views
1

私は次のように私の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を使用しています。このソリューションは、複数の欠点があります。

  1. それは
  2. __builtin_xxx醜いソリューションであることはgccのバージョンでのみ使用可能です>私たちは
  3. IDEをmethod1にするために、3つのデフォルトパラメータを追加する必要が4.8
  4. は、上のデフォルトパラメータを示してい自動補完は、ユーザーが提供するものではありません!

別の解決策は、基本的に前の溶液に非常に類似している__LINE____FILE____func__を使用しています。それらは、関数スコープの外で定義されていない、と彼らはこのように使用されるべきである:

void caller() 
{ 
    obj1->method1(12, 4, "sample", __func__, __FILE__, __LINE__); 
} 

Hereは、両方のソリューションの実施例です。

より良いユーザがmyClassオブジェクトでmethod1を呼び出すときに発信者を記録するソリューションはありますか。より良い解決策として、私は具体的には、3つのパラメータを追加してmethod1の宣言を変更しないことを意味します。

+0

可能な複製の複製[C/C++は、関数呼び出しを追跡するための巧妙な方法が必要です]のように見える(https://stackoverflow.com/questions/3315248/cc-need-a -clear-way-to-track-function-calls) – user835611

+0

マクロ解決策がパフォーマンスを犠牲にしないので、もっと良いことを明確にしたいと思うかもしれません... IDEの問題は実際にIDEの問題であり、C++の問題ではありません。あなたは何を言っていますか? –

+0

パフォーマンスについて気にしない場合は、コールスタックを使用できます:http://stackoverflow.com/questions/3899870/print-call-stack-in-c-or-c –

答えて

0

別の醜いソリューションが、私は...

使用マクロ自動的__LINE____FILE__を追加する...などを使用しています。物事をパラメータに変換する。

#define Method(param0,param1) Method(param0,param1,__LINE__) 

のためにそれはあなたのマクロは通常の関数として働きたい場合、あなたは多くのことを行う必要があり、それはまだ動作しない場合があり、問題をたくさん持っています。

エラーログに役立てるために使用します。

+0

私はこの回答をより良い解決策!もっと明確にするために質問を更新しました。 – ManiAm

0

Print the file name, line number and function name of a calling function - C Prog

I'd pass the data to the function through parameters (maybe get the help of a macro) 

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
And to call them 

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 
Note: __func__ is C99; gcc, in mode C89 has __FUNCTION__ 
+0

私はこの回答をより良い解決策とは考えていません!もっと明確にするために質問を更新しました。 – ManiAm

関連する問題