0

次の問題で立ち往生しています:

次の 2 つの正しく機能するマクロがあります (Fortran90 コードに拡張)。

#define ld_dx(A)   (  (A(ixp1)-A(ix  ))/(dx)  )
#define rd_dx(A)   (  (A(ix  )-A(ixm1))/(dx)  )

(注: これらのマクロは、次の追加マクロに依存します。

#define ix    2:nx-1
#define ixp1  1+ix+1
#define ixm1 -1+ix-1

そして、それらは宣言にも依存します:

integer, parameter :: nx = 100, dx = 1

)

私のコードでは、これらのマクロを呼び出しで使用できます。

X = X + ld_dx(Y)

また:

X = X + rd_dx(Y)

ここで、代わりに d_dx(A,l) を記述して ld_dx(A) を呼び出し、d_dx(A,r) を記述して rd_dx(A) を呼び出せるようにしたいと考えています。したがって、例は次のようになります。

X = X + d_dx(Y,l)

また

X = X + d_dx(Y,r)

=> このシンタックス シュガーを提供できる CPP マクロを探しています (数学表記にできるだけ近づけるため)。<=

最も簡単なことは次のとおりです。

#define d_dx(A,s)  s ## d_dx(A)

残念ながら、これは機能しません。CPP 変換

d_dx(Y,l)

の中へ:

l ## Y)

他の CPP 連結関連の質問を調べて、いろいろ試しましたが、わかりませんでした。助けてくれてありがとう!

サム

PS: マクロ 'ld_dx(A)' と 'rd_dx(A)' の名前を 'dl_dx(A)' と 'dr_dx(A)' に変更しても問題ないことに注意してください。だろう:

#define d_dx(A,s)  d ## s ## _dx(A)

残念ながら、これはどちらも機能しません: CPP 変換

d_dx(Y,l)

の中へ:

d ## l ## _dx(Y) 
  1

エラー: (1) の式に右括弧が必要です

つまり、連結は単に実行されません。

4

2 に答える 2

2
#define PASTE(x,y) x##y
#define d_dx(A,s) PASTE(s,d_dx)(A)

トークンの貼り付け(##演算子)と文字列化(#演算子)は、隣接する引数の置換を抑制するため、2つのステップで実行する必要があります。

于 2012-04-13T11:52:53.980 に答える
0

スペースなしで試してください。プリプロセッサには、## の両側のスペースを無視するものと、無視しないものがあります。

#define d_dx(A,s)  d##s##_dx(A)
于 2012-04-15T07:23:25.123 に答える