【问题标题】:Fortran Preprocessor Macro with Newline带换行符的 Fortran 预处理器宏
【发布时间】:2020-04-06 03:10:44
【问题描述】:

我正在尝试在预处理器宏中添加换行符。

我想要这样做的一个原因是要释放一些变量,但首先要检查以确保它们已被分配。如果它们没有被分配,那么应该有一个有用的错误。在这个例子中:

$ cat main.F90 
program main
   implicit none
   integer :: n = 10
   integer, allocatable, dimension(:) :: x, y

   allocate(x(n))

#define check_deallocate(QQQ) \
   if (.not. allocated(QQQ)) then \
      write(*,*) '** Error, QQQ is not allocated' \
      error stop \
   else \
      deallocate(QQQ) \
   endif

   check_deallocate(x)
   check_deallocate(y)

end program

对于这段代码,我得到以下信息:

$ gfortran -E main.F90   #-E outputs the preprocessed source
...
   if (.not. allocated(x)) then       write(*,*) '** Error, x is not allocated'       error stop    else       deallocate(x)    endif
   if (.not. allocated(y)) then       write(*,*) '** Error, y is not allocated'       error stop    else       deallocate(y)    endif
...

显然,这是不可取的,因为不遵守 132 个字符的限制。因此我的问题是:在预处理的源代码中包含换行符的语法是什么?

以下是我发现的一些问题并不能完全回答我的问题

  • 这个问题是针对 C++ here 提出的,但它似乎不适用于 fortran。

  • 我不想定义另一个宏(例如___CR__)并使用sed 或其他一些实用程序将其替换为\n。我希望解决方案存在于“典型”预处理器(例如 ifort 和 gfortran)中。

如果我的要求是不可能的,那也是我的问题的答案。另外,我有点意识到 fortran 预处理器缺乏标准化,但我仍然要求一个相对通用的解决方案。

【问题讨论】:

标签: fortran c-preprocessor preprocessor


【解决方案1】:

这本身是不可能的,但如果允许您使用单独的预处理步骤,您可以使用以下方法:

SUFFIXES:
.SUFFIXES: .f90 .o

.f90.o:
    fpp -P $/n/g' > $*.ftn
    ifort -free -c $*.ftn

(未经测试。我在this link 找到了这个建议)

【讨论】:

  • 我看到了那个链接,但我不明白 -P 参数实际上对 fpp 做了什么。你可以解释吗?此外,(如问题中所述),我试图避免使用其他实用程序或增加复杂性,例如通过所需的独立 fpp 调用。
  • 如果你可以为你的第一句话提供一个来源(或者甚至是一段时间的答案),它本身是不可能的,这对我来说就足够了。不过,我觉得这有点令人惊讶……
  • 链接的文章似乎表明这是不可能的。这是我该声明的唯一来源。
  • @Ross : -P 指令是为了防止混淆,因为行号可以通过后面的命令更改。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 2012-05-12
  • 2014-10-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多