Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran C预处理器宏:连接(例如Fortan90)_Fortran_Concatenation_C Preprocessor - Fatal编程技术网

Fortran C预处理器宏:连接(例如Fortan90)

Fortran C预处理器宏:连接(例如Fortan90),fortran,concatenation,c-preprocessor,Fortran,Concatenation,C Preprocessor,我遇到了以下问题: 我有以下两个正确的工作宏(扩展到Fortran90代码): (注意:这些宏取决于以下附加宏: #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) 或: 现在我想通过写d_dx(A,l)来调用ld_dx(A),通过写d_

我遇到了以下问题:

我有以下两个正确的工作宏(扩展到Fortran90代码):

(注意:这些宏取决于以下附加宏:

#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)
或:

现在我想通过写d_dx(A,l)来调用ld_dx(A),通过写d_dx(A,r)来调用rd_dx(A)。因此,示例如下所示:

X = X + d_dx(Y,l)

=>我正在寻找一个CPP宏,它可以提供这种语法糖(尽可能接近数学符号)。
标记粘贴(##运算符)和字符串化(#运算符)会抑制相邻参数的替换,因此必须分两步执行。

尝试不使用空格。一些预处理器忽略###两侧的空格,而其他预处理器则不忽略

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

你坚持使用宏而不是函数有什么特别的原因吗?是的,因为我们在做超级计算,而且(在我们的例子中)函数不能像“直接代码”那样优化。`函数不能像“直接代码”那样优化。'我也做超级计算,这句话很傻。我承认我的话表达得不好。我只是不想讨论这个问题,所以我做了一个大概的解释。尽管如此,我们还是有理由这么做的……我试过“定义d#u dx(A,s)粘贴(s,d#dx(A))”。为什么不起作用?此解决方案与IMB XL编译器和英特尔编译器配合使用效果良好。不幸的是,我现在不得不发现这个解决方案不能与gfortran调用的c预处理器一起工作(我尝试过:gcc版本4.6.2(gcc)、gcc版本4.4.4(gcc)、gcc版本4.1.2 20070115(SUSE Linux))。问题仍然与上述“PS”中所述的相同:根本不执行实际的串联。我们的目标是使用任何通用编译器编写代码。如果我们能找到一个同样适用于gcc编译器的解决方案,我将不胜感激。非常感谢。gfortran文档说cpp是在传统模式下调用的。这里讨论的两个选项之一可能会有所帮助:。如果是,请使用条件编译来选择旧版本和新版本<代码>#ifdef u STDC uu是一个开始。
X = X + d_dx(Y,l)
X = X + d_dx(Y,r)
#define d_dx(A,s)  s ## d_dx(A)
d_dx(Y,l)
l ## Y)
#define d_dx(A,s)  d ## s ## _dx(A)
d_dx(Y,l)
d ## l ## _dx(Y) 
  1
#define PASTE(x,y) x##y
#define d_dx(A,s) PASTE(s,d_dx)(A)
#define d_dx(A,s)  d##s##_dx(A)