Rumah > pembangunan bahagian belakang > C++ > Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?

Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?

Mary-Kate Olsen
Lepaskan: 2024-11-13 04:37:02
asal
862 orang telah melayarinya

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

constexpr and reinterpret_cast: Ralat dalam C Compilation

Pertimbangkan coretan kod berikut:


struct foo {
constexpr statik const void ptr = reinterpret_cast>(0x1);
};

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
Salin selepas log masuk

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ?
  reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
Salin selepas log masuk

};

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!

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
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan