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.
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
Adakah output yang dijangkakan bagi kod ini dijamin dalam C 20?
Tidak.
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.
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]).
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);
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>.
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.
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!