我正在尝试将旧的 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/