【问题标题】:Includes revealing with Fortran preprocessor包括用 Fortran 预处理器显示
【发布时间】:2021-07-09 01:49:48
【问题描述】:

我想了解预处理器内联如何包含到 Fortran 代码中。使用 C,这很简单:

Test.c:

#include <stdio.h>

int main(void) {
    return 0;
}

然后我编译使用:

gcc -E test.c

然后它按预期显示 C 预处理器生成的内容。

现在假设我有这个 Fortran 代码:

Test.f:

program test
include "mpif.h"
call mpi_init
call mpi_finalize
end

然后我运行:

gfortran -E -cpp test.f // For some reason I need -cpp when using -E in Fortran

但我不会得到预期的结果,即生成的嵌入到代码中的包含。

相反,我有这个:

# 1 "test.f"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.f"
   program test
   include  'mpif.h'

   call mpi_init

   call mpi_finalize
   end

我在这里做错了什么?

【问题讨论】:

标签: include fortran preprocessor


【解决方案1】:

Fortran 有自己的include 指令,不能与预处理器指令#include 混淆。据我了解,包含的代码没有嵌入到主文件中,而是编译器继续从包含文件编译,并在该文件的末尾返回到主文件。来自here

INCLUDE 语句指示编译器停止读取语句 从当前文件中读取包含的文件或文本中的语句 模块。

另外,included 文件没有进一步预处理,而#included 文件是。

请注意,还有一个命名约定,它只对带有大写后缀*.F*.F90 的文件启用预处理器。如果要预处理 *.f*.f90 文件,则需要在编译选项中指定,例如-cpp 对应于gfortran-fpp 对应于ifort

【讨论】:

  • 感谢您的回答!有没有办法在 Fortran 中使用#include
  • 是的,您可以使用它——您只需要确保预处理器已打开。请注意,预处理器不是标准 Fortran!但至少 gfortranifort 支持这一点。
  • 当我尝试在 Fortran 中使用 #include 时,我仍然没有将它内联到代码中:我使用以下命令:gfortran test.F90 -E -cpp 并且包含未预处理
  • 确保# 在第一列!哈希之前不允许有空格(这不是 FORTRAN 语法)。
  • 非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2011-08-03
  • 2011-08-29
  • 2018-11-20
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多