Long Long Int 대 Long Int 대 C의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!