gpt4 book ai didi

fortran - Fortran 可变参数宏中的 CPP/GPP(加上 Fortran//连接)

转载 作者:行者123 更新时间:2023-12-01 04:50:40 25 4
gpt4 key购买 nike

我正在尝试编译一个巨大的、世界知名的数值天气预报代码——主要是用 Fortran 90 编写的——它广泛地使用 cpp,并且成功地与 PGI、英特尔和 gfortran 一起使用。现在,我继承了一个版本,其中专家添加了数百个可变参数宏。他们使用 Intel 和 fpp,这大概是更以 Fortran 为中心的,并且可以让它全部工作。我需要使用 gfortran,并且无法让 cpp 使用其新增功能来处理此代码。

问题的粗略简化如下 -

预处理代码:

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

在没有 -traditional 的情况下使用 cpp选项将处理可变参数宏,但不处理 Fortran 连接:
$ cpp -P t.F90
PRINT *, "Hello"
sumv = (myadd(1, 2, 3, 4, 5))

另一方面,使用 -traditional flag 处理连接,但不处理可变参数宏:
$ 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 连接运算符分成单独的行。 IE。
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 concat 运算符),但它似乎也生成了一些 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))

一些研究( Remove the comments generated by cpp )表明,版权的增加可能是 cpp 的一个相对较新的“功能”。

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

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

如果有人知道我可以如何简单地抑制该版权信息的生成,那么我可能会做生意。

最佳答案

至少在下面描述的简单示例的上下文中,我通过安装较旧的 cpp 解决了该问题。 Other research已经确认 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))

关于fortran - Fortran 可变参数宏中的 CPP/GPP(加上 Fortran//连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41335383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com