Таким образом, можно ли через ассоциацию использования получить доступ к директиве препроцессора, определенной в модуле Fortran?
Контекст
Я использую операторы препроцессора для определения подпрограмм дляпечатать предупреждения и сообщения об ошибках.Например, я использую следующий модуль / подпрограмму в файле errors.f
для печати предупреждающих сообщений
module errors
use, intrinsic :: iso_fortran_env, only : error_unit=>stderr
implicit none
contains
!> Print formatted warning message.
subroutine warn_print( file, line, mesg )
implicit none
character(len=*), intent(in) :: file
integer, intent(in) :: line
character(len=*), intent(in) :: mesg
write(stderr,'(a,a,a,i4,a,a)') "WARNING::", file, ":", line, ": ", mesg
end subroutine warn_print
end module errors
и в отдельном файле errors.h
, I use
вышеупомянутого модуля и определяюмакрос препроцессора
use errors
#define warn( text )warn_print(__FILE__,__LINE__,text)
Затем я #include
файл errors.h
, в каком бы файле / модуле я не хотел использовать процедуру печати предупреждений, которая позволяет мне просто писать
call warn("Some warning message")
и компилятор автоматически включит файл и номер строки, по которой было вызвано предупреждающее сообщение.
Вопрос
Использование #include 'errors.h'
довольно необычно в коде Фортранаи он скрывает use
модуля errors
.В идеале я бы предпочел определить вышеупомянутый препроцессор в самом модуле ошибок.Однако при использовании этого модуля эта директива препроцессора недоступна программе / модулю, который use
s этот модуль.
Есть ли способ сделать директиву препроцессора доступной через ассоциацию использования?
Единственный другой способ, которым я могу думать об этом, это просто иметь модуль ошибок и определить директиву препроцессора в моем вызове компилятору (используя, например, флаг -D
с ifort).Будем весьма благодарны за любые предложения по альтернативному способу достижения вышеуказанного.