1. ホーム
  2. c++

[解決済み] PRETTY_FUNCTION__, __FUNCTION__, __func__の違いは何ですか?

2022-02-09 11:08:57

質問

とはどう違うのですか? __PRETTY_FUNCTION__ , __FUNCTION__ , __func__ また、それらはどこで文書化されているのでしょうか?どれを使うかどうやって決めればいいのでしょうか?

どのように解決するのですか?

__func__ は暗黙のうちに宣言される識別子で、関数内で使用されると、関数名を含む文字配列変数に展開されます。 C99でC言語に追加された。 由来 C99 §6.4.2.2/1:

識別子 __func__ はトランスレータによって暗黙のうちに、あたかも各関数定義の開始波括弧のすぐ後に宣言された

static const char __func__[] = "function-name";

が現れ、function-nameは語彙的に囲む関数の名前である。 この名前は関数の飾り気のない名前です。

マクロではないので、前処理時に特別な意味を持たないことに注意してください。

__func__ はC++11でC++に追加され、そこで"an implementation-defined string"を含むと指定されました(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++ では、C99 をサポートしていないコンパイラーでは __func__ ).

__PRETTY_FUNCTION__ は gcc 拡張で、ほとんど __FUNCTION__ ただし、C++の関数の場合は、関数のシグネチャを含む関数の名前が含まれます。 Visual C++にも似たような(全く同じではない)拡張機能があります。 __FUNCSIG__ .

非標準のマクロについては、コンパイラのドキュメントを参照するとよいでしょう。 Visual C++の拡張機能は、C++コンパイラのMSDNドキュメントに含まれています。 "定義済みマクロ" . gcc ドキュメント拡張は、gcc ドキュメント ページで説明されています。 "文字列としての関数名."