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 int,而不是long long 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>
但是,这是一种 hackish 解决方案。有没有办法指定编译器的类型等效性?
不幸的是,这在 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中文网其他相关文章!