2015-12-14 198 views

回答

4

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

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

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

parameter更类似于在C/C的const声明++。这是一个不变的表达。

要获得预处理器Fortran语言,你可以考虑使用.F扩展或力C预处理Fortran代码

2

参数是确实是你给它一个名称的恒定值。

#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/PI1/22/7,其评估为1/154而不是7/22

+1

但是'7/22'和'1/154'具有相同的值,所以不成问题, 对? :-) – rici

+0

@rici:mh,154会导致6位机器溢出。 –

5

正如其他答案中的许多细节所述,具有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 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)