Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencetak Penunjuk Fungsi dalam C Tanpa Menggunakannya?

Bagaimana untuk Mencetak Penunjuk Fungsi dalam C Tanpa Menggunakannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-25 07:33:29913semak imbas

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

Mencetak Penunjuk Fungsi Tanpa Invocation

Apabila cuba mencetak fungsi tanpa kurungan (iaitu, sebagai f dan bukannya f()), seseorang mungkin menghadapi keputusan yang tidak dijangka seperti sentiasa mencetak nilai 1. Tingkah laku yang kelihatan paradoks ini berpunca daripada mekanisme asas yang terlibat.

Dalam kod yang disediakan, pernyataan cout << pr; sebenarnya tidak menggunakan fungsi pr. Sebaliknya, ia menghantar penuding fungsi pr ke cout. C secara tersirat mentafsir penuding ini sebagai nilai bool, dengan penuding bukan nol yang menilai kepada benar dan seterusnya mencetak sebagai 1.

Untuk mencetak penuding fungsi itu sendiri, seseorang mesti menghantarnya secara eksplisit ke penuding void* . Ini boleh dicapai dengan menggunakan ungkapan seperti cout << (void*)pr.

C 11 dan Function Pointer Overloading

Dengan kemunculan C 11, kaedah yang lebih mudah untuk mencetak penunjuk fungsi muncul. Melebihi << operator untuk penunjuk fungsi membolehkan output yang lebih bermaklumat. Sebagai contoh, seseorang boleh mentakrifkan lebihan beban yang mencetak alamat dan arity fungsi (bilangan argumen):

<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) << ")";
}

Lebihan ini akan mencetak output dalam format (func_ptr=

) (num_args=< ;arity>).
Dengan menggunakan lebihan beban ini, seseorang boleh mendapatkan maklumat yang lebih terperinci tentang penunjuk fungsi apabila mencetaknya menggunakan cout.

Atas ialah kandungan terperinci Bagaimana untuk Mencetak Penunjuk Fungsi dalam C Tanpa Menggunakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn