Rumah >pembangunan bahagian belakang >C++ >Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?

Mengapakah `long int` kadangkala berkelakuan seperti `int64_t` dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-10-30 22:45:18510semak imbas

Why does `long int` sometimes behave like `int64_t` in 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!

Kenyataan:
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