Вы можете использовать препроцессор для распечатки имени файла и номера строки.Возможно, вы захотите воспользоваться предопределенными символами препроцессора __LINE__
и __FILE__
.Вот пример:
Макрос препроцессора определен в заголовочном файле (чтобы его можно было использовать в нескольких местах), назовите его errormsg.h :
#define ERRORMSG(msg) write(0,'("There was an error at ",I4," in file ",/,A,/,"Error message: ",A)') __LINE__,__FILE__,msg
Затем вы можете включить этот заголовочный файл в вашу программу, библиотеку или файлы модуля, например:
#include "errormsg.h"
program main
ERRORMSG("not really an error...")
call foo()
end program
subroutine foo()
ERRORMSG("not an error too!")
end subroutine
ERRORMSG("not really an error...")
кажется странным синтаксисом для кода на фортране, но его заменяет препроцессор cиспользуя определение макроса.Поэтому, когда это скомпилировано, это выглядит так:
write(0,'("There was an error at ",I4," in file ",/,A,/,"Error message: ",A)') __LINE__,__FILE__,"not really an error"
Для моего макроса ERRORMSG
я решил использовать файловый блок 0 для печати в stderr.Очевидно, у вас есть свобода писать сообщение как угодно, если оно приводит к синтаксически правильному коду на языке FORTRAN.
Чтобы получить это для компиляции, необходимо передать флаги компилятору, и они немного отличаются от компилятора к компилятору.Это сработало для меня, например:
gfortran -cpp -o errorTest errorTest.f90
То есть для gfortran -cpp
вызывает c-препроцессор перед компиляцией.Вывод вышеуказанной программы выглядит следующим образом:
There was an error at 5 in file
errorTest.f90
Error message: not really an error...
There was an error at 13 in file
errorTest.f90
Error message: not an error too!
Это может иметь эффект, который вы ищете, особенно если вы пишете только одну подпрограмму на файл.