c++ - C++ 中的通用 block 等价物

标签 c++ fortran fortran77 fortran-common-block

我正在尝试将旧的 Fortran 77 代码转换为 C++,并且大多数变量都在 Common block 中声明,例如:

COMMON/BLK1/Gw(200),Eta(4096),t(4096),Phi(200),w(200)
COMMON/BLK2/g,dw,Vel,M,dt,N,Ioutp1,Ioutp2
COMMON/BLK3/Hs,Std,E,Hs1,Tdt

据我了解,公共(public) block 仅用于使变量在整个程序的不同子例程中都可以访问。因此,在 C++ 程序中,我是否能够使用变量(在 main 之外)创建结构并以这种方式将变量作为结构的成员调用?

最佳答案

基于我对 this page 中 COMMON 的理解,C++ 等价物是创建一个名为 common.h 的文件(带有 include guards),其中包含:

 namespace BLK1
 {
      int const Gw = 200;
      int const Eta = 4096;
      int const t = 4096;
      int const Phi = 200;
      int const w = 200;
 }

 namespace BLK2
 {
      extern int g, dw, Vel, M, dt, N, Ioutp1, Ioutp2;
 }

 namespace BLK3
 {
      extern int Hs, Std, E, Hs1, Tdt;
 }

此外,在项目的一个 .cpp 文件中,您需要为任何非常量提供定义,例如在 foo.cpp 中:

 #include "common.h"

 namespace BLK2
 {
      int g, dw, Vel, M, dt, N, Ioutp1, Ioutp2;
 }

 namespace BLK3
 {
      int Hs, Std, E, Hs1, Tdt;    // initialized to 0 by default
 }

您可能想使用不同于 int 的类型,例如无符号长。我假设初始化值是常量;如果不是,则将 int const 更改为 extern int 并删除初始化程序。初始化程序必须进入 .cpp 文件中的定义。

避免在头文件中声明非常量、非外部变量的错误;如果 header 包含在两个不同的单元中,这会导致未定义的行为。

例如,您可以通过编写 BLK1::Eta 来访问这些变量。

正如您所猜测的那样,使用 struct 而不是命名空间可能被认为更整洁,尽管您仍然必须创建声明为 extern 的结构实例> 在 header 中,并在一个 .cpp 文件中定义;如果您使用的是 C++11 之前的版本,那么提供初始化程序会更烦人。

(当然,更好的方法是重构代码以不使用全局变量。但作为直接翻译的第一步可能很有用)。

关于c++ - C++ 中的通用 block 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846934/

相关文章:

c - 使 visual studio FORTRAN-C 混合代码 gfortran-gcc 兼容的最小修改

compiler-errors - 更改续行限制的 Fortran 77 选项出现问题

linux - 我在哪里可以获得在 redhat linux 上安装 f2c 的文件?

c++ - 我们如何在线程中使用参数

c++ - 将十六进制 char 值转换为其字符串文字以在 sstream 上使用

Python numpy/f2py 链接库

emacs - 修改 fortran 中注释的 emacs 缩进行为

fortran - Fortran 95 编译器可以编译 Fortran 77 代码吗?

C++:如何将十六进制 HANDLE 转换为十进制?

c++ - operator<< 无法输出 std::endl -- 修复?