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可变宏中的CPP/GPP(加上Fortran//串联)_Fortran_C Preprocessor_Variadic - Fatal编程技术网

Fortran可变宏中的CPP/GPP(加上Fortran//串联)

Fortran可变宏中的CPP/GPP(加上Fortran//串联),fortran,c-preprocessor,variadic,Fortran,C Preprocessor,Variadic,我正试图编译一个巨大的,世界著名的数值天气预报代码-主要用Fortran 90编写-广泛使用cpp,并成功地与PGI,Intel和gfortran一起使用。现在,我继承了一个版本,专家们已经添加了几百个可变宏。他们使用Intel和fpp,这可能更以Fortran为中心,并且可以让一切正常工作。我需要使用gfortran,但无法让cpp使用新添加的代码 问题大致简化如下: 要预处理的代码: PRINT *, "Hello" // "Don" #define adderv(...) (mya

我正试图编译一个巨大的,世界著名的数值天气预报代码-主要用Fortran 90编写-广泛使用cpp,并成功地与PGI,Intel和gfortran一起使用。现在,我继承了一个版本,专家们已经添加了几百个可变宏。他们使用Intel和fpp,这可能更以Fortran为中心,并且可以让一切正常工作。我需要使用gfortran,但无法让cpp使用新添加的代码

问题大致简化如下:

要预处理的代码:

    PRINT *, "Hello" // "Don"
#define adderv(...) (myadd(__VA_ARGS__))
    sumv = adderv(1, 2, 3, 4, 5)
不使用
-传统
选项而使用cpp将处理可变宏,但不会处理Fortran串联:

$ cpp -P t.F90
    PRINT *, "Hello"
    sumv = (myadd(1, 2, 3, 4, 5))
另一方面,使用
-traditional
标志处理串联,但不处理可变宏:

$ 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开始,感觉自己越来越接近了,但现实是,我可能离解决方案还有很长的路要走。它不接受
,也不展开
\uuu VA\u ARGS\uuu
。当然,以下不再是一个真正的可变宏

    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连接运算符拆分成单独的行,这可能让我觉得既丑陋又痛苦。i、 e

PRINT *, "Hello" // "Don"
变成

PRINT *, "Hello" /&
&              / "Don"
cpp和gpp的本质让我有点害怕,但如果有人看到了成功的潜力,并可能为我指明正确的方向,我将非常感激。如果我足够绝望的话,重组这个庞大的代码确实不是一个选项,尽管自动化策略(比如将那些concat操作符拆分成单独的行)可能是这样


其他信息-roygvib建议我尝试添加
-C
标志。我们最近一直在抑制它,因为它似乎在Fortran代码中引入了许多C注释。好吧,我试过了,我想我更接近了:

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

当我用-p和-c标志调用时,自然地它通过C++(FORTRAN COUNT操作符),但它也似乎生成了一些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))
$/lib/cpp-P-ct.F90
/* Copyright(C)1991—2014自由软件基金会。
此文件是GNUC库的一部分。
.
.
.
/*wchar__t使用ISO/IEC 10646(第二版,2011-03-15出版)/Unicode 6.0*/
/*我们不支持C11*/
打印*,“你好”/“唐”
sumv=(myadd(1,2,3,4,5))
一点研究()表明,版权的增加可能是cpp的一个相对新的“特征”

我看不到任何简单的方法来抑制这种情况,所以我想我可能需要构建一个包装器脚本(例如mycpp),它如上所述调用cpp,过滤掉任何C风格的注释,然后将其传递到下一个阶段

它不是最优的,我有点怀疑,因为整个包中也有C代码。但是,理论上,我认为最糟糕的事情是无法在预处理的C代码中生成注释


如果有人知道我可能如何简单地禁止生成该版权信息,我可能正在做生意。

至少在下面描述的简单示例中,我通过安装一个旧的cpp解决了这个问题。已经确认版本4.8在预处理的Fortran代码中插入了额外的C注释,这显然不是一件好事。解决方案很简单,使用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))  

附加-C选项(cpp-P-C)可能会有帮助…?它确实会生成所需的代码,但问题是它也会生成一堆C风格的注释作为标题。也许我可以找到一种方法来抑制这部分内容?抑制不希望产生的注释的一种方法是修改
cpp
的源代码,并构建您自己的版本,以满足您的需要。我想到了这一点,John Zwinck。我不知道(目前)cpp是否可以被隔离以进行简单的更改,或者我是否必须将其与完整的gcc环境相结合,这是我有点不愿意深入探讨的。没有
,cpp-传统的
与Fortran不兼容。忘记变量宏和其他高级功能,研究这里已经提供的许多Q/A