Fortran 的参数语句和 C/C++ 的#define 语句类似吗?

问题描述 投票:0回答:4

我是 Fortran 新手,但在我看来,Fortran 的

parameter
类似于在 C/C++ 中使用
#define
。它们相似吗?它们的使用方式相同吗?我知道
#define
是一个预处理器语句,我不确定这可能会导致
#define
parameter
有什么相似或差异。

fortran
4个回答
7
投票

正如其他答案中详细介绍的那样,具有

parameter
属性的对象是一个 命名常量。该属性可以在声明中指定,例如在 Alexander Vogt 给出的 examples 中或使用
parameter
语句。

如果预处理用作

#define
,如

#define int_literal 1

然后,正如其他地方所介绍的那样,在预处理阶段存在文本级替换,因此我们得到了文字常量

现在,为什么这种区别很重要?也就是说,这两个片段之间有什么真正的区别吗

#define nx 100
real x(nx)

integer, parameter :: nx=100
real x(nx)

可能有人会认为,并不多。不过,请考虑一下

integer, parameter :: hello(*) = [1,2,3]
type(some_type), parameter :: tp = some_type(4,5,6)

我们将努力找到合适的

#define
,让我们可以做任何我们想做的事情,就好像我们拥有那些命名常量一样。通过这些命名常量,我们可以得到类似的东西

print *, hello(2)-PRODUCT(hello(1::2)), tp%b   ! For b one of the components.

也就是说,命名常量是可以以异国情调的方式进行操作的数据对象,其操作方式比文字文本替换所希望的要多得多。

对于真正的病理学,请考虑这个愚蠢的例子

#define x 2.1
print *, 1/x

integer, parameter :: x=2.1
print *, 1/x 

为了完整起见,参数语句的示例是

integer i
parameter (i=1)

5
投票

parameter
更类似于 C/C++ 中的
const
声明。这是一个常数表达式。

要在 Fortran 中使用预处理器,您可以考虑在 Fortran 代码上使用 .F 扩展名或强制使用 C 预处理器


3
投票

#define
是定义宏的预处理器语句。在预处理步骤中,宏将被其值替换。请注意,预处理器语句不属于 Fortran 标准的一部分。并非每个编译器都支持它们。

另一方面,

A

parameter
表示命名常量(类似于 C 结构
const
)。任何变量类型都可以用来声明常量。该常量在编译时定义:

integer, parameter :: i = 1
real, parameter    :: a = 1.
complex,parameter  :: z = (1., 1.)

3
投票

参数确实是一个您为其命名的常量值。

#define 预处理器命令有一个更广泛、更强大的目标:它用一个字符串替换程序文本中出现的另一个字符串。替换的字符串可以是任何代码片段。这是一种让程序修改自身的方法(就在编译之前)。

比如说

#define Operator +
S= 1 Operator 2 Operator 3;

相当于

S= 1 + 2 + 3;

您可以轻松转向

S= 1 - 5 * 2 - 5 * 3;

如果这有道理的话。

诚然,通过宏定义常量参数是一种古老的用法,

#define DAYS_PER_WEEK 5
#define PI 22/7

尽管编译器不自觉地认为它们是参数,但它们仍然是纯文本。在本示例中,

1/PI
1/22/7
,其计算结果为
1/154
,而不是
7/22

© www.soinside.com 2019 - 2024. All rights reserved.