我编写了一小段代码,试图遵守 Fortran 2003 标准。代码可在 github 上获取。
这是我的 makefile:
FC = gfortran
FLGS = -g -pg -std=f2003 -I. -fbounds-check
DEPS = camx.prm
OBJ = unit-test-hadvppm.o hadvppm.o
#linker macro
%.o: %.f03 $(DEPS)
$(FC) -c -o $@ $< $(FLGS)
#build targets
gnu-amd64-linux: $(OBJ)
$(FC) -o $@ $^ $(FLGS)
clean: gnu-amd64-linux
rm *.o
使用上面的 makefile 和 gfortran 代码编译没有问题。
但是,如果我尝试使用 iFort 编译它,只需使用
ifort -o ifort-amd64-linux unit-test-hadvppm.f03 hadvppm.f03
它不起作用,请参阅下面的输出。我认为这与 .f03 免费文件格式有关。 iFort 中是否有类似于 gfortran 的 -std=f2003 标志的标志?我试图在 iFort 文档中找到这个,我应该仔细看看吗?
标准中没有任何内容指定文件的后缀。英特尔始终表示,无论标准版本如何,他们都将
*.f90
视为免费源格式的后缀。这只是一个约定,并不基于任何标准文件。
也许
f90
后缀有点不幸,看起来只适用于 Fortran 90,但您应该毫不犹豫地将它用于每个自由格式的源文件。
我个人也不喜欢
.f95
、.f03
、.f08
文件的做法。我应该仅仅因为我从较新的标准调用一些内在函数而重命名源文件吗?
您可以使用 -free 和 -fixed ifort 命令行选项指定源文件中使用的源格式,分别为自由格式和固定格式。
作为一个单独的问题,您可以设置标准来使用 -stand[:xxx] 选项来发出诊断。 这不会更改编译器生成的代码,它只会更改编译器发出的诊断信息。 这相当于 gfortran 的 -std=xxx 选项。
作为另一个单独的问题,您可以使用 -standard-semantics 编译器选项指定编译器应更改其行为以匹配使用 Fortran 标准指定的行为。 这涵盖了编译器的行为历史上与 Fortran 标准最终要求或建议的行为不同的场景。
正如评论和弗拉基米尔的回答中所建议的那样 - 最简单的选择是对任何自由格式源文件使用 .f90 (在没有 -fixed 命令行选项的情况下,ifort 将将其视为自由格式源),无论它已写入的标准。