long long int vs. long int vs. int64_t en C
Considérez le programme C suivant :
<code class="cpp">#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>
Dans les compilations GCC 32 bits et MSVC 32/64 bits, la sortie du programme sera :
int: 0 int64_t: 1 long int: 0 long long int: 1
Cependant, dans une compilation GCC 64 bits, la sortie deviendra :
int: 0 int64_t: 1 long int: 1 long long int: 0
Ce comportement est dû au fait que dans les compilations 64 bits, int64_t est défini comme long int, et non comme long long int. Pour résoudre ce problème, nous pouvons utiliser des vérifications spécifiques à la plate-forme comme suit :
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
Cependant, cette solution n'est pas idéale, car elle repose sur des combinaisons spécifiques de compilateur et de plate-forme. Une méthode plus fiable consisterait à spécifier explicitement l’équivalence de type au compilateur. Malheureusement, C ne permet pas de définir une telle équivalence entre les types de données de base. Au lieu de cela, nous pouvons nous appuyer sur des traits de type, tels que std::is_same. Par exemple :
<code class="cpp">// C++11 template <typename T> void same_type(T, T) {} void foo() { long int x; long long int y; same_type(x, y); // Will now compile successfully }</code>
Dans cet exemple, std::is_same est utilisé pour déterminer si x et y ont le même type, quelle que soit leur représentation sous-jacente.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!