Rumah > pembangunan bahagian belakang > C++ > Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?

Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?

Patricia Arquette
Lepaskan: 2024-12-30 14:15:16
asal
544 orang telah melayarinya

Can I Take the Address of a Standard Library Function in C  20?

Bolehkah saya Mengambil Alamat Fungsi yang Ditakrifkan dalam Perpustakaan Standard?

Pengenalan

Semasa bekerja dengan C, anda mungkin tertanya-tanya sama ada anda boleh mendapatkan alamat fungsi yang berada dalam perpustakaan standard. Soalan ini adalah penting, kerana ia boleh memberi kesan kepada penggunaan fungsi tersebut dalam pelbagai senario.

Soalan

Dalam coretan kod berikut, dua panggilan ke std::invoke dibuat:

std::invoke(std::boolalpha, std::cout); // #1
std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << '\n'; // #2
Salin selepas log masuk

Adakah output yang dijangkakan bagi kod ini dijamin dalam C 20?

Jawapan

Tidak.

Penjelasan

Gelagat program C tidak ditentukan secara jelas apabila percubaan dibuat untuk membentuk penunjuk kepada standard fungsi perpustakaan, melainkan fungsi itu telah ditetapkan secara eksplisit sebagai fungsi yang boleh dialamatkan. Ini dinyatakan dalam [namespace.std] piawai C.

Panggilan Pertama

Dalam panggilan pertama ke std::invoke, kami cuba mendapatkan penunjuk ke std::boolalpha . Nasib baik, [fmtflags.manip] datang untuk menyelamatkan kami:

Each function specified in this subclause is a designated addressable function ([namespace.std]).
Salin selepas log masuk

std::boolalpha sememangnya fungsi yang dinyatakan dalam subfasal ini, menjadikan baris ini terbentuk dengan baik dan bersamaan dengan:

std::cout.setf(std::ios_base::boolalpha);
Salin selepas log masuk

Panggilan Kedua

Malangnya, untuk panggilan kedua, [cctype.syn] memberitahu kami:

The contents and meaning of the header <cctype> are the same as the C standard library header <ctype.h>.
Salin selepas log masuk

Tiada mana-mana dalam pengepala perpustakaan standard ini std::tolower ditetapkan secara eksplisit sebagai fungsi boleh alamat. Oleh itu, kelakuan atur cara C ini tidak ditentukan, berpotensi mengakibatkan ralat penyusunan.

Kesimpulan

Keluaran yang dijangkakan bagi kod ini tidak dijamin dan kod itu mungkin tidak berjaya dikompilasi kerana kepada tingkah laku yang tidak ditentukan yang dikaitkan dengan mengambil alamat std::tolower.

Selain itu, ini terpakai bukan sahaja pada perpustakaan standard fungsi tetapi juga kepada fungsi ahli yang diisytiharkan dalam perpustakaan standard C. Mengambil alamat fungsi ahli tersebut juga mengakibatkan tingkah laku yang tidak ditentukan.

Atas ialah kandungan terperinci Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan