我正在将多个c ++应用程序的大型项目从32位MFC转换为64位。在可预见的未来,这些应用程序将需要以32位和64位进行编译。
我遇到过这些类型的INT_PTR和UINT_PTR。我有两个问题。
将这些类型用作一般整数用途的“默认”类型(例如循环计数器等)是最佳做法吗?
我知道这些类型的大小与您正在编译的环境的指针大小有关,但将它们用于通用整数似乎令人困惑。例如,对于(INT_PTR i = 0; i< 10; i ++)...;我不是指针或指针相关,所以该类型的名称让我感到困惑。是否有更好的预定义在这种情况下使用或我应该自己做?
我的编译器是VS2010。
由于
答案 0 :(得分:2)
INT_PTR
和类似的有一个非常具体的用例:它们模拟一个足够大的数据类型,并具有适当的对齐要求来保存整数或指针类型。它用于方法具有参数或返回类型的情况,该类型是整数数据类型或指针(如GetWindowLongPtr
)。
对于循环,除此之外没有其他通用建议:使用最合适的类型。如果您的循环索引用于索引容器,请将其设为size_t
。如果循环索引是一个在x
和y
之间的所有值上运行的整数,请使用x
和y
的类型,或者与两者兼容的类型。 INT_PTR
实际上不是合适的循环索引数据类型。
答案 1 :(得分:0)
如果您的循环与指针无关(即,它不用作数组或向量的索引或类似的东西),则只要需要通用整数类型,就使用int
。确保您的代码不依赖于int
的大小是一件好事(尽管MS VS int
对于两个平台都是32位)。
使用size_t
,vector<...>::size_type
或其他适当类型的索引相关循环。
答案 2 :(得分:0)
您可能需要查看此内容:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx/“Windows数据类型”
您可能对此类型的目的感到有点困惑。它是确保如果你将一个指针转换为一个int(你可能不应该这样做),你有一个适合的int类型。 Windows有点奇怪(如果内存服务)int编译64位时仍然是32位。如果你需要一个特定大小的int,我会使用确切的宽度类型(在stdint.h中)
答案 3 :(得分:0)
您可以使用数据类型“intptr_t”。它是特定于平台的数据类型。它在 32 位平台上保存 4 个字节的值,而在 64 位平台上保存 8 个字节的值。