Правильный суффикс для исходного файла Fortran 2003 — компилятор Intel Fortran

Я написал небольшой фрагмент кода, пытаясь придерживаться стандарта Fortran 2003. Код доступен на github.

Это мой make-файл:

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

Код без проблем компилируется с помощью вышеуказанного make-файла и gfortran.

Однако, если я попытаюсь скомпилировать его с помощью iFort, используя только

ifort -o ifort-amd64-linux unit-test-hadvppm.f03 hadvppm.f03

это не работает, см. вывод ниже. Я предполагаю, что это связано с бесплатным форматом файлов .f03. Есть ли в iFort флаг, похожий на флаг gfortran -std=f2003? Я пытался найти это в документации iFort, стоит ли искать повнимательнее?

введите здесь описание изображения


person seb    schedule 28.11.2013    source источник
comment
Почему бы просто не переименовать ваши файлы в *.f90 или *.F90? Окончание файла не должно зависеть от стандарта ;-) В основном я пишу на Фортране 2003/2008 и всегда использую *.F90 - у меня были проблемы с некоторыми компиляторами при использовании *.F03 несколько лет назад, которые исчезли после переименования файла. файлы.   -  person Alexander Vogt    schedule 28.11.2013
comment
@AlexanderVogt спасибо, попробую!   -  person seb    schedule 28.11.2013
comment
Возможно, стоит отметить, что некоторые компиляторы для Linux (включая ifort) по умолчанию интерпретируют расширение .F90 как файлы, которые необходимо передать препроцессору. Конечно, это вопрос стиля, использовать ли только расширение верхнего регистра или и то, и другое.   -  person sigma    schedule 21.06.2014


Ответы (2)


В стандарте нет ничего, определяющего суффикс файлов. Intel всегда заявляла, что они рассматривают *.f90 как суффикс для бесплатного исходного формата независимо от стандартной версии. Это просто соглашение, не основанное на каком-либо стандартном документе.

Может быть, суффикс f90 немного неудачен, он выглядит только для Fortran 90, но вы не должны стесняться использовать его для каждого исходного файла в свободном формате.

Лично мне тоже не нравится практика .f95,.f03, .f08 файлов. Должен ли я переименовывать исходный файл только потому, что я вызываю некоторые встроенные функции из более нового стандарта?

person Vladimir F    schedule 28.11.2013
comment
Если стандарта нет и я не использую компилятор fortran от Intel, имеет ли это значение? Кажется сомнительным рассматривать соглашения одного компилятора как спецификацию языка. - person Joshua Cheek; 02.10.2016
comment
Почему бы просто не использовать суффикс .f? Обратите внимание, что когда я это делаю, мне требуется 7 пробелов перед каждой строкой, поэтому может показаться, что суффиксы сообщают компилятору, какие функции включить, что является довольно хорошим аргументом в пользу суффикса .f08. - person Joshua Cheek; 02.10.2016
comment
Дело в том, что все компиляторы поддерживают .f90, зачем использовать что-то еще? f90 - это не Fortran 90, это бесплатный исходный код. Я надеюсь, что теперь люди не будут приходить с файлами f15... - person Vladimir F; 02.10.2016
comment
Итак, мой компилятор gfortran (часть gcc) будет вести себя одинаково для .f90 и .f08? - person Joshua Cheek; 02.10.2016
comment
@JoshuaCheek .f — форма с фиксированным исходным кодом, .f90 — форма со свободным исходным кодом. Будь проще. Да, gfortran поддерживает множество суффиксов, но стандартом де-факто является f90. Портативность — вот почему Fortran все еще существует спустя 60 лет. Фиксация на один компилятор прямо против этого. - person Vladimir F; 02.10.2016
comment
И да, @JoshuaCheek, ваш компилятор должен обрабатывать файлы .f90 точно так же, как файлы .f08 - все исходники в свободной форме. .f файлы специальные - они указывают фиксированные, как уже упоминалось. - person Ross; 18.08.2019

Вы можете указать исходную форму, используемую в исходном файле, с помощью параметров командной строки -free и -fixed ifort для свободной и фиксированной формы соответственно.

В качестве отдельной проблемы вы можете установить стандарт для диагностики с использованием опции -stand[:xxx]. Это не изменяет код, сгенерированный компилятором, а просто изменяет диагностику, которую выдает компилятор. Это эквивалент опции gfortran -std=xxx.

В качестве еще одной отдельной проблемы вы можете указать, что компилятор должен изменить свое поведение, чтобы оно соответствовало указанному с помощью стандарта Fortran, используя параметр компилятора -standard-semantics. Это охватывает сценарии, в которых поведение компилятора исторически отличалось от того, что в конечном итоге требовалось или рекомендовалось стандартом Fortran.

Как рекомендовано в комментариях и ответе Владимира - самый простой вариант - просто использовать .f90 для любого исходного файла произвольной формы (который будет рассматриваться ifort как исходный файл произвольной формы при отсутствии параметра командной строки -fixed), независимо от стандарт, по которому он был написан.

person IanH    schedule 28.11.2013