Rumah >pembangunan bahagian belakang >C++ >Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?
constexpr and reinterpret_cast: Ralat dalam C Compilation
Pertimbangkan coretan kod berikut:
struct foo {
constexpr statik const void ptr = reinterpret_cast
};
Kod ini menyusun tanpa ralat dalam g v4.9, tetapi gagal dalam clang v3.4 dengan ralat:
error: constexpr variable 'ptr' must be initialized by a constant expression
Penyusun Mana Yang Betul?
Mengikut piawaian C 11, dentang adalah betul. Piawaian menyatakan bahawa ungkapan malar tidak boleh melibatkan reinterpret_cast. Ini bermakna permulaan ptr dalam coretan kod adalah tidak sah.
Permulaan yang Betul
Cara yang betul untuk mengisytiharkan ungkapan jenis ini ialah menggunakan alternatif kaedah, seperti:
<br>struct foo {<br> statik constexpr intptr_t ptr = 0x1;<br>};<br>
Ini akan berfungsi dalam kedua-dua clang dan g .
Penyelesaian untuk GCC
Sementara GCC menerima kod asal coretan secara teknikalnya tidak betul, ia menyokong penyelesaian menggunakan makro __builtin_constant_p:
<br>struct foo {<br> statik constexpr const void* ptr =</p> <pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
};
Penyelesaian ini membolehkan GCC melipat ungkapan tidak tetap dan menganggapnya sebagai pemalar. Walau bagaimanapun, ia bukan sebahagian daripada piawaian C dan harus digunakan dengan berhati-hati.
Atas ialah kandungan terperinci Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!