C での Long Long Int 対 Long Int 対 Int64_t
C の型特性を使用しているときに、いくつかの特異な動作が発生する可能性があります。次のプログラムについて考えてみましょう:
<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>
32 ビット コンパイルでは、出力は期待どおりです:
int: 0 int64_t: 1 long int: 0 long long int: 1
ただし、64 ビット GCC コンパイルでは、出力は異なります:
int: 0 int64_t: 1 long int: 1 long long int: 0
これは、64 ビット モードでの int64_t の定義の違いによるものです。
<code class="c++"># if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; # endif</code>
64 ビット モードでは、int64_t はlong long ではなく、long int として定義されます。 int.
これを修正するには、is_int64 テンプレートを long long int 用に特殊化することができます:
<code class="c++">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
ただし、これはハック的な解決策です。コンパイラに型の等価性を指定する方法はありますか?
残念ながら、 C/C では不可能です。コンパイラは基本的なデータ型の等価性を定義し、typedef は一方向のみに機能します。
別の回避策は、型の正確な名前に依存するのではなく、型特性を使用して型のプロパティをチェックすることです。
<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>
このアプローチにより、型を明示的に比較せずに型のプロパティをチェックできます。
以上が`long int` が C の `int64_t` のように動作する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。