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中文網其他相關文章!