私は、どこかで、このプログラムのヘッダファイルが含まれていることをカスタムassert
マクロ読みを疑うこれをサポートするために
#define fooco_assert(expr) \
((void) ((expr) || \
fooco_assert_failed(#expr, __FILE__, __LINE__, function_name)))
extern int fooco_assert_failed(const char *expr, const char *srcfile,
int lineno, const char *fnname);
のようなもの、作者はそれでfunction_name
の定義があるだろうというスタイルルール作らすべての単一機能の始めから、が利用可能かどうかを考えずに、将来的に必要に応じてfooco_assert
にコールを追加することができます。ご存じのように、実際に使用されていない限り、コンパイラはコンパイルされたプログラムに文字列を出力することはありません。効率的な問題ではありません。
確かにはですが、プログラムの読み込みや編集にはスピードバンプです。 C++ 11コンパイラは、現在の関数の名前を保持している__func__
と呼ばれる定義済みの変数を提供します。これは代わりに使用できます。この機能は、1999年にC標準に追加されました。多くのC++コンパイラは、すぐにそれを採用しました。他のC++コンパイラには__func__
はありませんが、それと同等の独自拡張があります。 __FUNCTION__
。これらは、ではなく、のマクロであることに注意してください。
#ifndef __func__
#define __func__ "<unavailable>"
#endif
は、__func__
が利用可能かどうかを検出しません。代わりに、このようなことをしなければならないでしょう(私の頭の上から離れて、全くテストされていない):
#if __cplusplus >= 201103L || __GNUC__ >= 3
// __func__ is available in C++11, and in GCC >= 3.0
#elif _MSC_VER || __GNUC__
// pre-C++11 MSVC and ancient versions of GCC call this
// feature __FUNCTION__ instead
#define __func__ __FUNCTION__
#elif ...
// ... etc etc for all other compilers you care about
#else
#define __func__ "<unavailable>"
#endif
これは一般的な使用場所の例を表示できますか?おそらくオープンソースプロジェクトへのリンクですか?私はロギングのために** **使用されている場合にのみこれが行われていることを見てきました。したがって、ログを持たない小さな関数にはまだ存在することがあります。 – BoBTFish
これは、そこに置く人だけが答えることができる質問です(私はデバッグの助けと思っていますか、存在していたマクロに関連しています*) –
@BoBTFish残念ながら、これはプロプライエタリなコードです。私は "__FUNCTION__"のように表示されるデバッグマクロを探しましたが、何もありません。使用されていないので、コンパイラはO1自体で完全に自信を持って削除しました。コードを扱っている人はすべて同じ* culture *に従っています* –