带换行符的Fortran预处理程序宏

问题描述 投票:0回答:1

我正在尝试将换行符放在预处理程序宏中。

我想要这样做的一个原因是要释放多个变量,但是首先要检查以确保已分配它们。如果未分配它们,则应该有一个有用的错误。在此示例中:

$ 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个回答
0
投票

这是不可能的,但是如果允许您使用单独的预处理步骤,则可以执行以下操作:

SUFFIXES:
.SUFFIXES: .f90 .o

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

(未经测试。我在this link处发现了这个建议]

© www.soinside.com 2019 - 2024. All rights reserved.