呼び出しを行わずに関数ポインターを出力する
括弧なしで関数を出力しようとすると (つまり、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 & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }
このオーバーロードは、(func_ptr=
) (num_args=<) の形式で出力を出力します。 ;arity>).以上がCで関数ポインタを呼び出さずに出力する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。