__PRETTY_FUNCTION__
、、の違いは何ですか? これらはどこに文書化されています__FUNCTION__
か__func__
? どれを使用するかをどのように決定すればよいですか?
ベストアンサー1
__func__
は暗黙的に宣言された識別子であり、関数内で使用されると関数名を含む文字配列変数に展開されます。これはC99でCに追加されました。C99§6.4.2.2/1:
識別子は
__func__
、各関数定義の開き括弧の直後に宣言されているかのように、翻訳者によって暗黙的に宣言されます。static const char __func__[] = "function-name";
が現れました。ここで、function-name は、字句的に囲む関数の名前です。この名前は、関数の飾りのない名前です。
これはマクロではなく、前処理中に特別な意味を持たないことに注意してください。
__func__
C++11でC++に追加されたが、そこでは「実装定義の文字列」を含むものとして指定されている(C++11 §8.4.1[dcl.fct.def.general]/8)が、これはCの仕様ほど有用ではない。(__func__
C++に追加するという当初の提案はN1642)。
__FUNCTION__
は、一部の C コンパイラ (gcc および Visual C++ を含む) がサポートする標準以前の拡張機能です。一般に、__func__
サポートされている場合は を使用し、サポートされていないコンパイラを使用している場合にのみ を使用する必要があります__FUNCTION__
(たとえば、C99 をサポートしておらず、まだすべての C++0x をサポートしていない Visual C++ は を提供しません__func__
)。
__PRETTY_FUNCTION__
は、 とほぼ同じ gcc 拡張機能です__FUNCTION__
が、C++ 関数の場合は、関数のシグネチャを含む関数の「きれいな」名前が含まれます。Visual C++ には、同様の (ただし完全に同一ではない) 拡張機能 があります__FUNCSIG__
。
非標準マクロについては、コンパイラのドキュメントを参照してください。Visual C++拡張機能は、C++コンパイラのMSDNドキュメントに含まれています。「定義済みマクロ」gccドキュメントの拡張機能については、gccドキュメントページで説明されています。「関数名を文字列として」