2015-12-14 201 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)