我是Fortran的新手,但在我看来,Fortran parameter类似于#define在C/C++中使用.它们相似吗?它们是否以相同的方式使用?我知道#define是一个预处理语句,我不知道有什么异同,这可能会导致#define具有与parameter.
正如其他答案中的许多细节所述,具有该parameter属性的对象是命名常量.此属性可以在声明中指定,例如在Alexander Vogt给出的示例中或使用该parameter语句.
如果使用预处理#define,例如
#define int_literal 1
Run Code Online (Sandbox Code Playgroud)
然后,正如其他地方所述,在预处理阶段有文本级替换,因此我们有一个文字常量.
现在,为什么这种区别很重要?也就是说,两个片段之间是否存在任何真正的差异
#define nx 100
real x(nx)
Run Code Online (Sandbox Code Playgroud)
和
integer, parameter :: nx=100
real x(nx)
Run Code Online (Sandbox Code Playgroud)
?
人们可能会想,并不是很多.但是,考虑一下
integer, parameter :: hello(*) = [1,2,3]
type(some_type), parameter :: tp = some_type(4,5,6)
Run Code Online (Sandbox Code Playgroud)
我们很难找到合适的#defines,它们允许我们做任何我们想要的事情,就好像我们有那些命名常量一样.对于那些命名常量,我们可以有类似的东西
print *, hello(2)-PRODUCT(hello(1::2)), tp%b ! For b one of the components.
Run Code Online (Sandbox Code Playgroud)
也就是说,命名常量是数据对象,可以通过文本文本替换以异乎寻常的方式操作.
对于真正的病理学,请考虑一个愚蠢的例子
#define x 2.1
print *, 1/x
Run Code Online (Sandbox Code Playgroud)
和
integer, parameter :: x=2.1
print *, 1/x
Run Code Online (Sandbox Code Playgroud)
为了完整性,参数语句的示例是
integer i
parameter (i=1)
Run Code Online (Sandbox Code Playgroud)