ログメッセージが呼び出された場所のファイル、行、および関数を記録するデバッグログメッセージ関数を構築しようとしています。
#define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__ );
上記のコードは一部のコンパイラで動作しますが、すべてではありません。私のコードは、GCC および Microsoft Visual Studio と相互互換性がある必要があります。互換性を確保するために、以下の定義を追加しました。
#ifndef __FUNCTION_NAME__
#if defined __func__
// Undeclared
#define __FUNCTION_NAME__ __func__
#elif defined __FUNCTION__
// Undeclared
#define __FUNCTION_NAME__ __FUNCTION__
#elif defined __PRETTY_FUNCTION__
// Undeclared
#define __FUNCTION_NAME__ __PRETTY_FUNCTION__
#else
// Declared
#define __FUNCTION_NAME__ "N/A"
#endif // __func__
#endif // __FUNCTION_NAME__
#define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __FUNCTION_NAME__, __FILE__, __LINE__ );
上記のコード スニペットの問題は、#else マクロがすべてのコンパイラでアクティブであるのに対し、他のマクロはアクティブでないことです。言い換えると、 が事前定義されたマクロ#if defined __func__
であるコンパイラでは false__func__
です。
私の質問は
- 関数名を見つけるためのクロス コンパイラ マクロを作成するにはどうすればよいですか?
- a が使用できるかどうかはどうすればわかり
__func__
ますか?