Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?
Long Long Int lwn. Long Int lwn. Int64_t dalam C
Semasa menggunakan ciri jenis C, beberapa gelagat pelik boleh ditemui. Pertimbangkan program berikut:
<code class="c++">#include <iostream> #include <cstdint> template <typename T> bool is_int64() { return false; } template <> bool is_int64<int64_t>() { return true; } int main() { std::cout << "int:\t" << is_int64<int>() << std::endl; std::cout << "int64_t:\t" << is_int64<int64_t>() << std::endl; std::cout << "long int:\t" << is_int64<long int>() << std::endl; std::cout << "long long int:\t" << is_int64<long long int>() << std::endl; return 0; }</code>
Dalam penyusunan 32-bit, output adalah seperti yang dijangkakan:
int: 0 int64_t: 1 long int: 0 long long int: 1
Walau bagaimanapun, dalam penyusunan GCC 64-bit, output adalah berbeza:
int: 0 int64_t: 1 long int: 1 long long int: 0
Ini disebabkan oleh perbezaan dalam takrifan int64_t dalam mod 64-bit:
<code class="c++"># if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; # endif</code>
Dalam mod 64-bit, int64_t ditakrifkan sebagai int panjang, tidak panjang panjang int.
Untuk membetulkan perkara ini, seseorang boleh mengkhususkan templat is_int64 untuk int long long:
<code class="c++">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
Walau bagaimanapun, ini adalah penyelesaian hackish. Adakah terdapat cara untuk menentukan kesetaraan jenis kepada pengkompil?
Malangnya, ia tidak boleh dilakukan dalam C/C . Pengkompil mentakrifkan kesetaraan jenis data asas dan typedef hanya berjalan satu arah.
Penyelesaian alternatif ialah menggunakan ciri jenis untuk menyemak sifat jenis, dan bukannya bergantung pada nama tepatnya:
<code class="c++">template <typename T> struct some_type_trait : boost::false_type { }; template <> struct some_type_trait<int64_t> : boost::true_type { }; // Usage if (some_type_trait<long int>::value) { // ... }</code>
Pendekatan ini membolehkan untuk menyemak sifat jenis tanpa membandingkan jenis secara eksplisit.
Atas ialah kandungan terperinci Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!