-1

__func__事前定義された識別子により、関数内で関数名を使用できるようになることを理解しています。しかし、いつ必要になりますか?目的の 1 つはデバッグです。他のユースケースは何ですか?

4

3 に答える 3

7

更新:明確にするために、(移植可能な)CまたはC ++では、現在の関数の名前を「文字列」(配列)として使用できることは何もないため、charその文字列をどこかに書き込むことにかなり制限されています-これはすべて可能です診断または「デバッグ」目的と見なされます。そうは言っても、関数名の何らかの使用法を考え出す必要があるかもしれません。たとえば、宣言型セキュリティ、構成可能なログ (これも「診断」ですが) などです。

__func__実際、Web 上のほとんどの説明とマニュアルでは、 and (__LINE__さらに言えば__FILE__) のユーティリティはデバッグと診断であると明示的に言及しています。

個人的には、「より良い」assert()出力を可能にするために提供されていると思います。


現在の関数の名前を「プログラムで」知る必要があるときはいつでもそれを使用します。これは、デバッガーをほとんど除外します。デバッガーは、既に利用可能なデバッガーを介して現在の関数の名前 (またはコンテキスト) を持っています。

__func__(またはその古い非標準の前身である) は通常、および おそらくマクロと__FUNCTION__一緒に使用され、現在の関数 (およびファイル、行) を自動的に含むトレースまたは診断出力機能を提供します。__LINE____FILE__

#define TRACE(s) \
        do { fprintf(stderr, "%s:%d:%s: %s", __FILE__,  __LINE__, __func__, (s)); \
        } while (0)

その後、次のように使用できます。

int my_func(char* arg1, int arg2)
{
    TRACE("Doing stuff...");

    /* ... */
}

詳細と例については、このStackoverflow Q&A を参照してください。

このような出力のみの目的であっても__func__、関数の「修飾されていない装飾されていない名前」しか含まれていないため、 の使いやすさはかなり制限されています。上記の例では、「my_func」によってのみ実行されます。

C/C++ では、オーバーロードされた関数の場合、値だけではそれらを区別できません__func__。クラス名および/または名前空間名も含まれません。

また、コンパイラは通常、完全な関数シグネチャやその他の詳細を含む非標準のバリエーションを提供します ( GCC (「参考文献」を参照__PRETTY_FUNCTION__)、Microsoft C/C++ (「参考文献」を参照__FUNCDNAME__) __FUNCSIG__)。

于 2013-05-28T06:35:18.067 に答える
2

__FILE__このマクロをコードと一緒に__LINE__コードに追加すると、プログラムのログを読んでいる人が非常に役立つことに気付きました。また、ログ関数の記述が大幅に簡単になります。コンパイラが処理してくれるので、これらの値をハードコーディングする必要がないからです。

ユーザーはアプリケーションのソース コードにアクセスできない可能性があることに注意してください。場合によっては、ログ トレースと出力のみがユーザーに提供されます。彼らが何が起こっているのかを知るための透明な方法があればいいのに.

于 2013-05-28T06:48:12.860 に答える
1

それがconstexpr(あるべきですが、少なくとも現在の GCC では残念ながらそうではありません) 場合、それをハッシュして、非常に簡単で効率的な (コンパイル時、ランタイム オーバーヘッドなし) RTTI システムを実装するために使用できます。

std::type_info::hash_codeまた、RTTI をリンクする必要がなく、異なる呼び出しが異なる値を返すことを許可するという落とし穴がない、より使いやすいバージョンに役立つ可能性もあります。
標準で提供されるバージョン (C++11 の時点) では、そのような保証が明示的に提供されていないため、連想コンテナー ( など) 内のキーとして以外は役に立たなくなりますstd::map
異なる呼び出し (少なくとも同じバイナリ、または少なくともまったく同じ定義を持つ型) が保証されている場合、シリアル化などでより使いやすくなります。

(はい、ハッシュ関数には衝突があることを認識しています。はい、理論上は問題です。しかし、妥当な量のビット (たとえば、64) と妥当な量のキー (たとえば、数百) を考えると、めったに起こりません。実際には問題にならない程度であり、検証できないものではありません。)

于 2013-05-28T09:01:42.423 に答える