Экспорт макросов в Фортран - PullRequest
4 голосов
/ 23 октября 2019

Я хотел бы имитировать C-код в простом проекте на Фортране, где я бы #define использовал некоторые макросы и использовал их в своем коде.

Например, модуль животных мог бы выглядеть следующим образом:

#define timestwo(x) (2 * (x))

module animal_module

    implicit none

    ! ...

    ! test
    procedure :: answer

    ! ...

    function answer(this) result(n)
        class(animal), intent(in) :: this
        integer :: n
        n = timestwo(42)
    end function answer
end module animal_module

Если я использую макрос в модуле, как вы можете видеть, у меня нет ошибок, и он работает просто отлично.

Однако использование этого макроса в основном файле неработать вообще:

program oo

    use animal_module

    implicit none

    print *, 'the macro ', timestwo(5)

end program

С компилятором, жалующимся на макрос:

main.F90(21): error #6404: This name does not have a type, and must have an explicit type.   [TIMESTWO]
    print *, 'the macro ', timestwo(5)

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 23 октября 2019

При использовании макросов препроцессора, эффект представляет собой простую замену текста в этом файле . Исходный файл вопроса не создает никакой сущности модуля, которую можно экспортировать, а замены не распространяются вверх по «цепочкам использования».

Фортран отличается от C тем, что use module - это не то же самое, что #include "header.h": исходный код модуля не включен в основной файл программы для замены текста.

Если вы действительно хотите использовать этот подход, вам следует повторить определение макроса для исходного кода программы. Чтобы упростить задачу, вы можете определить этот общий макрос в файле включения препроцессора и #include it (не include):

#include "common_macros.fi"
program
...
end program

и аналогичных в файле модуля.

Лучше было бы отказаться от использования макросов препроцессора для реализации «простых функций». Реальная функция в модуле будет экспортируемой сущностью. Простая простая функция, скорее всего, будет встроена (с соответствующими флагами оптимизации) так же легко, как макрос.

1 голос
/ 23 октября 2019

Вот пример кода, который работает в консольном приложении

#define twice(x) (2*x)

program Console1
implicit none

print *, twice(7)
! 14

end program Console1

, который необходимо скомпилировать с опцией /fpp

enter image description here

...