我是Fortran的新手,但在我看来,Fortran parameter
类似于#define
在C/C++中使用.它们相似吗?它们是否以相同的方式使用?我知道#define
是一个预处理语句,我不知道有什么异同,这可能会导致#define
具有与parameter
.
parameter
更类似于const
C/C++中的声明.这是一个不变的表达.
要在Fortran中获取预处理器,您可以考虑在Fortran代码上使用.F扩展或强制C预处理器
正如其他答案中的许多细节所述,具有该parameter
属性的对象是命名常量.此属性可以在声明中指定,例如在Alexander Vogt给出的示例中或使用该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
s,它们允许我们做任何我们想要的事情,就好像我们有那些命名常量一样.对于那些命名常量,我们可以有类似的东西
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)