__PRETTY_FUNCTION__、__FUNCTION__、__func__ の違いは何ですか? 質問する

__PRETTY_FUNCTION__、__FUNCTION__、__func__ の違いは何ですか? 質問する

__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ドキュメントページで説明されています。「関数名を文字列として」

おすすめ記事