constexpr dan Initialization of a Static const void Pointer with reinterpret_cast: Compiler Differences Explained
Dalam coretan kod yang diberikan, constexpr const void void penunjuk diisytiharkan menggunakan reinterpret_cast. Kod ini menimbulkan persoalan tentang tafsiran pengkompil yang betul mengikut piawaian dan cara yang betul untuk mengisytiharkan ungkapan tersebut.
Kebenaran Pengkompil
Piawaian menentukan bahawa constexpr pembolehubah, seperti penuding void const statik dalam kes ini, mesti dimulakan dengan ungkapan malar. Ungkapan reinterpret_cast, walau bagaimanapun, tidak dianggap sebagai ungkapan pemalar teras mengikut piawaian C 11. Oleh itu, clang adalah betul dalam melaporkan ralat untuk kod ini.
Pengisytiharan Betul
Untuk mengisytiharkan penunjuk constexpr const void statik dengan betul, terdapat ialah beberapa pilihan:
Gunakan intptr_t sebaliknya: Gunakan jenis intptr_t dan hantarkannya ke penunjuk kosong apabila mendapatkan semula nilai, seperti berikut:
static constexpr intptr_t ptr = 0x1; // ... reinterpret_cast<void*>(ptr);
Pelanjutan GCC/clang: GCC dan clang menyokong sambungan yang didokumentasikan sedikit menggunakan __builtin_constant_p:
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
Ini ungkapan akan dilipat malar oleh kedua-dua penyusun. Walau bagaimanapun, ambil perhatian bahawa sambungan ini bukan sebahagian daripada standard dan mungkin tidak disokong dalam versi pengkompil akan datang.
Atas ialah kandungan terperinci Adakah undang-undang untuk memulakan penunjuk statik constexpr const void menggunakan reinterpret_cast?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!