ホームページ  >  記事  >  バックエンド開発  >  Cで関数ポインタを呼び出さずに出力する方法は?

Cで関数ポインタを呼び出さずに出力する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-25 07:33:29913ブラウズ

How to Print a Function Pointer in C   Without Invoking It?

呼び出しを行わずに関数ポインターを出力する

括弧なしで関数を出力しようとすると (つまり、f() ではなく f として)、常に値 1 を出力するなど、予期しない結果が発生する可能性があります。この一見矛盾した動作は、関係する基礎となるメカニズムに由来しています。

提供されたコードでは、ステートメント cout <<🎜;広報;実際には関数 pr を呼び出しません。代わりに、関数ポインタ pr を cout に渡します。 C はこのポインターを暗黙的に bool 値として解釈します。null 以外のポインターは true と評価されるため、1 として出力されます。

関数ポインター自体を出力するには、それを明示的に void* ポインターにキャストする必要があります。 。これは、cout << のような式を使用して実現できます。 (void*)pr.

C 11 と関数ポインターのオーバーロード

C 11 の出現により、関数ポインターを出力するためのより便利な方法が登場しました。 << のオーバーロード関数ポインターの演算子を使用すると、より有益な出力が可能になります。たとえば、関数のアドレスとアリティ (引数の数) を出力するオーバーロードを定義できます。

<code class="cpp">template <class RType, class ... ArgTypes>
std::ostream &amp; operator<<(std::ostream &amp; s, RType(*func)(ArgTypes...))
{
    return s << "(func_ptr=" << (void*)func << ")(num_args=" 
              << sizeof...(ArgTypes) << ")";
}

このオーバーロードは、(func_ptr=

) (num_args=<) の形式で出力を出力します。 ;arity>).
このオーバーロードを採用すると、cout を使用して関数ポインターを出力するときに、関数ポインターに関するより詳細な情報を取得できます。

以上がCで関数ポインタを呼び出さずに出力する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。