2012-03-10 4 views
2

私はファイルと関数の場所を取得するために__FILE____func__というマクロを使用しています。 私のコードは次のように構成されている...関数が呼び出された場所でのファイル名と関数名の取得

TEST.H

class TestClass 
{ 
... 
void Log(int status); 
... 
}; 

Test.cppの

... 
void TestClass::Log(int status) 
{ 
printf("%s %s %i",__FILE__,__func__, status); 
} 
... 

を(私はゲームエンジンを使用しています注意してください)。

私はクラスオブジェクトを作成し、それを使って私が望むものを記録します。

example.cpp

#include "Test.h" 
    ... 
TestClass tt; 
    ... 
    tt.Log((int)1); 
    ... 

は、問題は出力がTest.cppののファイルや機能名を貼り付け、およびexample.cppのファイル名と機能を注意していることです。

これを回避する方法はありますか、またはprintf文を何度も何度も直接使用する必要がありますか?

おかげ

答えて

2

あなたはどこのコードでprintfを使用する必要はありませんが、あなたは余分なパラメータ__FILE____func__TestClass::Logを呼び出す必要があります。

あなたはそれぞれの呼び出しに余分なパラメータを書き留めする必要はありませんので、しかし、あなたはそのためのマクロを脅威を作成することができないでください。

#define TEST_CLASS_LOG(testClassInstance,status) \ 
       testClassInstance.Log((int)status, __FILE__, __func__); 

、代わりの

tt.Log((int)1); 
を呼び出すにはあなたは、Fを考慮して Log署名を変更する必要があると思い

TEST_CLASS_LOG(tt,1); 

を呼ぶだろう

またはコースの追加パラメータ:

だから、
class TestClass 
{ 
    static void Log(int status); 
}; 

void TestClass::Log(int status, const char* file, const char* func) 
{ 
    printf("%s %s %i", file, func, status); 
} 

#define TEST_CLASS_LOG(status) \ 
        TestClass::Log((int)status, __FILE__, __func__); 

、あなたの場合:

void Log(int status, const char* fileName, const char* functionName); 

はまた、私はLogは、任意のクラスのメンバーにアクセスしていないので、あなたはそれがさらに容易にし、それstatic作ることができます参照してくださいこのようにそれを行う、あなただけコールする必要があるでしょう:マクロが実行時に展開するよう

TEST_CLASS_LOG(1); 

は残念ながら、あなたのコードを変更せずに、自動的にこれを行う方法はありません。あなたのコンパイラが現在見ているのは:

void TestClass::Log(int status) 
{ 
    printf("%s %s %i","Test.cpp","Log", status); 
} 

です。そのため、パラメータとして渡されるファイル名と関数名が必要です。

+0

おかげでたくさんの伴侶を。 –

+0

@RoverEye、喜んで助けてください! –

1

余分なパラメータを使用してLog関数を呼び出すマクロ展開を作成します。

void Log(const char* filename, const char* funcname, int status) 
{ 
    printf("%s %s %i",filename,funcname, status); 
} 

... 
#define LOG(status) Log(__FILE__, __func__, status) 
... 


int foo() { 
    LOG(3); 
} 

EDIT:このような、より詳細な説明

このコードは、どのようにそれは単にあなたが望むもののためにマクロを使用するためのアイデアを紹介し、あなたのクラスのメソッドのログを使用する方法を示していません。また

私は、静的メソッドを使用して見ていると、そのためのLoggerクラス自体のインスタンスを必要としない、ロギング実装のほとんど。だから私はクラスのメンバーを取るマクロを提案しなかったのです。

+0

マクロを作成しても、あなたのメソッドを魔法のように自由な関数にするわけではありません。それはクラスの一部ですが、そうでないように呼び出すことはできません。 –

+0

私はちょうどマクロを使う考えをしました。もちろん、Logをクラス内のメソッドにしたい場合は、少し変更する必要があります。私が見たログの実装では通常、静的なログオブジェクトを使用しているので、実際にはLOGマクロはログに記録するオブジェクトである追加のパラメータを取りません。 –

+0

答えにコメントを移動したいことがあります。 –

0

あなたは機能TestClass::Log()にファイル名と機能位置パラメータを作ることができます。コールは、以下のようになります。

TestClass tt; 
... 
tt.Log(__FILE__,__func__,(int)1); 
... 
+0

これを行うことができますが、このログ関数を何度も使用することになるので、ロケーションパラメータとして使用するのは苦痛になります。 –

+0

@RoverEyeマクロを定義して、再利用する必要はありません余分なパラメータ –

+0

@RoverEye:その場合、Luchianの答えが示すようにマクロを追加できます。 – Lazer

関連する問題