Fortran中的CPP预处理语句可以缩进吗?

Can CPP preprocessing statement in Fortran be indented?

我对使用 Fortran 预处理语句还很陌生,并且有一个问题可能很自然。 Fortran 预处理语句可以缩进吗?我在 Linux (openSUSE Leap) 上使用 Gfortran 4.8.1 进行了测试,结果发现它根本无法缩进。

以下代码 main.f90 适用于 gfortran -cpp main.f90 -o main

program main
    implicit none
#ifdef DEBUG
    print *, "I am in debug mode"
#endif 
    print *, "hello world!"
end program main

但是下面会抛出一个错误:

program main
    implicit none
    #ifdef DEBUG
    print *, "I am in debug mode"
    #endif 
    print *, "hello world!"
end program main

错误信息是Error: Invalid character in name at (1)。 这是否意味着我们应该始终从行的第一行开始编写预处理语句,或者这只是编译器特定的规则?任何帮助将不胜感激,并提前致谢!

你可以使用 C 预处理器进行处理,然后编译处理后的文件,即假设你的程序在 main.f90,然后像这样:

cpp -nostdinc -C -P -w main.f90 > _main.f90
gfortran -o main _main.f90

在这方面,这个问题很有用:Indenting #defines

不,它们不能缩进,因为 traditional mode 中的 gfortran 运行s CPP 不允许缩进。它们必须始终从第一列开始。

您可以手动 运行 CPP,但要非常非常小心。 如果您在某处使用 // 字符串连接运算符,预处理器会将其视为注释。您必须使用 -C 标志,如 @ewcz 在 his/her 答案中所示,该标志禁止丢弃评论。

一些编译器提供他们自己的 FPP 预处理器,其行为不同。