CPP/GPP在fortran variadic宏(加上fortran // confenation)中



我正在尝试编译一个庞大的,世界知名的数值天气预测代码 - 主要用fortran 90写成 - 它使用 cpp PGI,Intel和Gfortran。现在,我继承了一个版本,专家添加了数百个variadic宏。他们使用Intel和 fpp ,大概是以fran的为中心,可以使一切正常工作。我需要使用gfortran,并且无法获得 cpp 的新代码。

问题的总体简化如下 -

预处理的代码:

    PRINT *, "Hello" // "Don"
#define adderv(...) (myadd(__VA_ARGS__))
    sumv = adderv(1, 2, 3, 4, 5)

使用 cpp 没有-traditional选项将处理variadic宏,而不能处理fortran constenation:

$ cpp -P t.F90
    PRINT *, "Hello"
    sumv = (myadd(1, 2, 3, 4, 5))

另一方面,使用-traditional标志处理串联,而不是variadic宏:

$ cpp -P -traditional t.F90 
t.F90:2:0: error: syntax error in macro parameter list
 #define adderv(...) (myadd(__VA_ARGS__))
 ^
    PRINT *, "Hello" // "Don"
    sumv = adderv(1, 2, 3, 4, 5)

我真的很难找到一种促进两者的处理方法。

我首先使用 gpp 开始,感觉自己越来越近,但是现实是,我可能仍然有很长的路要走。它不接受...,并且不扩展__VA_ARGS__。当然,以下几乎不再是一个变性宏...

    PRINT *, "Hello" // "Don"
#define adderv() (myadd(__VA_ARGS__))
    sumv = adderv(1, 2, 3, 4, 5)

$ gpp t.F90
    PRINT *, "Hello" // "Don"
    sumv = (myadd(__VA_ARGS__))

我已经无济于事了,到目前为止,我看到的最佳可能性使我感到丑陋和痛苦,就是将所有我的fortran串联操作员分为单独的线条。即。

PRINT *, "Hello" // "Don"

变成

PRINT *, "Hello" /&
&              / "Don"

CPP和GPP的内部对我有些吓人,但是如果有人看到成功的潜力,并且可能会将我指向正确的方向,我会非常感谢。尽管我足够绝望,但重组这个巨大的代码确实不是一个选择,尽管自动化策略(例如将这些concat操作员分成单独的行)可能是。


其他信息 - Roygvib建议我尝试添加-C标志。我们最近一直在压制它,因为它似乎将许多C评论引入了Fortran代码。好吧,我继续尝试了一下,我想我更近:

$ cat t.f90
        PRINT *, "Hello" // "Don"
    #define adderv(...) (myadd(__VA_ARGS__))
        sumv = adderv(1, 2, 3, 4, 5)

当我调用-p和-c标志时,它自然会通过C (Fortran Concat Operator),但它似乎也会生成一些C受到C的版权文本:

   $ /lib/cpp -P -C  t.F90
   /* Copyright (C) 1991-2014 Free Software Foundation, Inc.
      This file is part of the GNU C Library.
   .
   .
   .
   /* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /       Unicode 6.0.  */
   /* We do not support C11 <threads.h>.  */
       PRINT *, "Hello" // "Don"
       sumv = (myadd(1, 2, 3, 4, 5))

一点点研究(删除CPP产生的评论)表明,该版权的这种添加可能是CPP的相对较新的"功能"。

我看不到任何简单的抑制方法,因此我认为我可能需要构建一个包装脚本(例如 mycpp ),该脚本称为上述CPP,将任何C-样式评论,然后将其传递到下一阶段。

这不是最佳的,我有点谨慎,因为整个软件包也有C代码。但是,从理论上讲,我认为最糟糕的事情是未能在预处理的C代码中生成评论。

如果有人知道我如何简单地抑制该版权消息的产生,我可能会从事业务。

至少在下面描述的简单示例的上下文中,我通过安装较旧的CPP解决了问题。其他研究证实,4.8版将其他C评论插入了预处理的Fortran代码中,这显然不是一件好事。解决方案很简单,使用CPP-4.7。

安装(在Ubuntu 16.04上)比我预期的要简单。简单

sudo apt-get install cpp-4.7
put the necessary executable in /usr/bin/cpp-4.7

这是我想要的预处理以下示例。

$ /usr/bin/cpp-4.7 -C -P t.F90
    PRINT *, "Hello" // "Don"
    sum = (myadd(1, 2, 3, 4, 5))  

像Donmorton一样,我试图将cpp -P与Fortran文件一起使用,因为__VA_ARGS__和其他东西都使用了。因为没有-C选项//并添加了评论。

所以,我使用另一个答案的想法删除了这些外部线:

cpp -P -C t.F90 |  sed '//*.**// d; //*/,/*// d'

,我得到了预期的:

PRINT *, "Hello" // "Don"
sumv = (myadd(1, 2, 3, 4, 5))

但是,仍然存在问题。您无法在宏Args中使用//(C 样式注释):// something/* something */

替换

最新更新