我正在努力将应用程序移植到Linux平台上的64位。该应用程序目前在Linux,Windows,Mac 32位和Windows 64位上受支持。我们经常遇到的问题之一是对int使用long,反之亦然。直到现在这都不是问题,因为long和int在当前支持应用程序的平台中是可互换的(都是4个字节)。代码库是一个巨大的代码库,许多遗留代码都带有#defines用于许多数据类型,这使得搜索所有long的使用并使用int适当替换它很麻烦。
答案 0 :(得分:9)
答案 1 :(得分:5)
没有。在Linux x86_64上,ABI指定long是8字节类型(LP64)。事实上,大多数(如果不是全部)64位Unix系统(包括64位OS X,AFAIK)都是LP64,因此这不是Linux所特有的。
除了修复代码之外,没有。
如果你需要一个足以存储指针值的可移动整数类型,请使用intptr_t或uintptr_t(但通常希望将指针值存储到整数中意味着你做错了,所以请三思!) 。对于能够表示两个指针之间差异的整数类型,请使用ptrdiff_t。对于对象的大小,请使用size_t。
答案 2 :(得分:2)
这取决于你的意思是"移植到64位"。
您只是希望您的应用程序能够在64位Linux上运行:您可以将其编译为32位,并且它将在大多数提供32位库的发行版上以兼容模式运行。为此,您必须使用32位版本的gcc(例如Ubuntu上的包gcc:i386
),或使用带有本机gcc版本的-m32
标志。
您希望从处理器的long mode(又名x86_64架构)中受益,但仍然使用大多数32位C约定(包括4个字节的long int
):您可以使用x32 ABI使用gcc的-mx32
标志,这要求您的发行版允许它(必须在内核中启用支持,并且需要特定的库,例如在/libx32
中)。我正在使用Ubuntu 16.04,这种模式工作得非常好,只是可用的预编译库要少得多。
您希望完全使用x86_64架构和ABI,但需要4个字节long
:这是不可能的,因为x86_64 ABI要求long
为8个字节。