【发布时间】:2019-06-21 15:25:46
【问题描述】:
在将大型代码库迁移到 x64 系统时,我遇到了整数类型的兼容性问题。
期望 INTEGER*4 的 Fortran 例程会传递在 C/C++ 端定义为 long 的整数。这是一些示例代码:
Fortran 接口:
SUBROUTINE FOO(N)
INTEGER*4 N
!! DO SOME WORK
END
C/C++ 代码:
long n = 1;
FOO(&n);
当然,这在为 x64 编译时不起作用,整数需要定义为 int。这些类型的调用被打了无数次,而手动替换它们将需要很长时间。
有没有更有效的方法来进行这些更改?
【问题讨论】:
-
用 awk 或类似的方式编写脚本。另外,如果它们需要固定大小,它们应该是 int32_t。
-
现在提供帮助为时已晚,但这就是我们拥有并且应该使用固定类型的原因。
int32_t将始终为 32 位。如果您的代码需要使用特定的大小,使用整数固定会使这变得容易得多。 -
这与将代码迁移到 x86 几乎没有关系。上面的代码可能从未在
sizeof(long) != sizeof(int)的任何系统上工作过。修复代码的正确方法是使用现代 Fortran 的 ISO C 绑定功能。不太正确的方法是使用 sed 和适当的正则表达式模式将非标准INTEGER*4转换为非标准INTEGER*8。 -
特别是考虑到即使在今天的 64 位系统中,这些约定也远非通用。参见 LP64 LLP64 ILP64 等。在你让它在 Unix 上运行之后,如果你继续使用
long而不是其他人推荐的,你可能会在 MS Windows 上得到一个非常不愉快的惊喜。
标签: c++ fortran migration 64-bit