C++ 在大型程序中将长变量更改为int类型
在将大型代码库迁移到x64系统时,我面临整数类型的兼容性问题 期望整数*4的Fortran例程是在C/C++端被定义为长的传递整数。以下是一些示例代码: Fortran接口:C++ 在大型程序中将长变量更改为int类型,c++,fortran,migration,64-bit,C++,Fortran,Migration,64 Bit,在将大型代码库迁移到x64系统时,我面临整数类型的兼容性问题 期望整数*4的Fortran例程是在C/C++端被定义为长的传递整数。以下是一些示例代码: Fortran接口: SUBROUTINE FOO(N) INTEGER*4 N !! DO SOME WORK END C/C++代码: long n = 1; FOO(&n); 当然,当为x64编译时,这不起作用,整数需要定义为int。这些类型的调用被无数次地执行,手动替换它们将花费永远的时间 有没有更有效的方法
SUBROUTINE FOO(N)
INTEGER*4 N
!! DO SOME WORK
END
C/C++代码:
long n = 1;
FOO(&n);
当然,当为x64编译时,这不起作用,整数需要定义为int。这些类型的调用被无数次地执行,手动替换它们将花费永远的时间
有没有更有效的方法来进行这些更改?首先尝试查找并替换,就像Steve在评论中建议的那样,这应该是可行的:
sed -i 's/integer\*4/integer\*8/gI' *.f90
其中,
-i
在文件中给出替换,末尾的i
给出不区分大小写的搜索,*
符号用\*
转义。您可能需要将*.f90
更改为您拥有的扩展名或*.f*
用awk或类似语言编写脚本。此外,如果它们需要固定大小,那么它们应该是int32_t.to late,以便现在提供帮助,但这就是为什么我们有,并且应该使用fixed with typeint32\t
将始终为32位。如果您的代码需要处理特定的大小,那么使用整数进行修复会更容易。这与将代码迁移到x86没有多大关系。上述代码可能从未在sizeof(long)!=sizeof(int)
。修复代码的正确方法是使用现代Fortran的ISO C绑定功能。一种不太正确的方法是使用sed和适当的正则表达式模式将非标准的INTEGER*4
转换为非标准的INTEGER*8
。特别是考虑到即使在今天的64位系统中,这些约定也远不是通用的。请参阅LP64 LLP64 ILP64等。在Unix上以某种方式工作后,如果继续使用long
而不是其他人推荐的方法,您可能会在MS Windows上得到一个非常不愉快的惊喜。