将 32 位旧代码移植到 64 位时如何处理更改数据类型大小?
How to handle changing data type sizes when porting 32-bit legacy code to 64-bit?
我们的团队正在将一个10+年前的遗留代码库移植到64位(即第一步将其编译为Win64)。我们的要求是代码既编译没有警告(在/W4),又我们的 lint 工具(PC-LINT)也不会抱怨。
我们有很多类似的问题,所以在这里我举一个作为例子:
void MyFunction(size_t n) {
long tmp = n;
Call3rdPartyApiThatTakesLongArgument(tmp);
}
这给出了有关变量大小不匹配的警告和 lint 错误,因为size_t
在 Win64 上增长到 64 位,而long
保持在 32 位。我们目前的目标是在static_cast
long
之前,边界检查n以确保它适合tmp
。然后,此检查会给我们另一个关于将无符号与已签名进行比较的警告。
我们最终得到的是一个巨大的宏,它利用decltype()
、std::make_signed
和std::make_unsigned
之类的东西,允许我们在没有警告的情况下进行边界检查和投射,即便如此,我们也不得不为我们在语义上知道的情况禁用一些 lint 警告。
该函数现在如下所示:
void MyFunction(size_t n) {
BOUNDSCHECK(long, n) // make sure n fits into long
long tmp = static_cast<long>(n);
Call3rdPartyApiThatTakesLongArgument(tmp);
}
使用decltype
和std::make_signed
等东西真的感觉不对 - 有没有更好的方法来实现我们正在努力做的事情?我们可能不是第一个将 Win32 应用程序移植到 Win64 的人,但我们在 Google 的共同努力并没有产生任何远程有用的东西......
编辑:MyFunction的签名也不在我们的控制之下,所以不幸的是,将n更改为long不是一个选项。
从size_t
转换为long
是一种缩小的转换。因此,据我所知,没有完美的转换。
我会将您的宏转换为模板函数。然后,您可以决定如何处理错误。 您可以将 API 更改为 long(但我认为这是它size_t
的原因)。
所以你必须决定当你的size_t
不适合long
时你会怎么做。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何处理具有无效数据类型的异常
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 将 32 位旧代码移植到 64 位时如何处理更改数据类型大小?
- 当数字可能超出C++中特定数据类型的范围时如何处理异常?
- 窗口后台处理程序究竟如何确定它将发送到打印处理器的数据类型?
- 解析一般CSV读取功能时,如何处理不同的数据类型?(不明确指定它们)
- 如何使用 C++ 驱动程序在 MongoDB 中使用 UserException 处理数据类型错误
- 模板函数,用于处理 C++ 中的不同数组维度和数据类型
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- 有必要在为Windows和Linux编写的程序中处理长数据类型吗
- 在C++中,如何编写函数,以便它可以处理任何数据类型
- c++正在寻找一种合理的方法来处理SqlServer数据类型datetime
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?
- 读取数据库/文件中的不同数据类型(c++中的文件处理)
- 是否可以在VTK中使用(polyData)编写器来处理来自其他库的数据类型?
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突
- 可以原子方式获取和处理的最大数据类型
- 是否有可能像处理内置数据类型那样处理class_inst = some_func(class_inst) ?