我正在尝试将换行符放在预处理程序宏中。
我想要这样做的一个原因是要释放多个变量,但是首先要检查以确保已分配它们。如果未分配它们,则应该有一个有用的错误。在此示例中:
$ 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预处理器缺乏标准化,但我仍在寻求相对通用的解决方案。
这是不可能的,但是如果允许您使用单独的预处理步骤,则可以执行以下操作:
SUFFIXES:
.SUFFIXES: .f90 .o
.f90.o:
fpp -P $/n/g' > $*.ftn
ifort -free -c $*.ftn
(未经测试。我在this link处发现了这个建议]