2014-09-11 1 views
0

Я пытаюсь подражать утверждениям C в Фортране, чтобы обеспечить соблюдение предварительных и последующих условий всех моих процедур. Таким образом, я могу предоставить пользователю более подробную информацию о ошибках во время выполнения, чем можно было бы разумно ожидать в противном случае.Можно ли предположить, что препроцессор Fortran будет работать на большинстве систем?

В целях реализации этого я использовал директивы препроцессора __FILE__ и __LINE__ и образующий assert макро, который расширяется до Fortran вызова подпрограммы. Вместо того, чтобы пытаться описать его здесь, я сделал git repo с небольшим количеством примеров кода. Если вы построите его с помощью

make test 
./test 

функция зависает, потому что вы вызвали функцию, которая ожидает положительный аргумент с отрицательным. Однако, если вы строите с

make test DEBUG=1 
./test 

ошибка поймана утверждением.

Это работает как с gfortran, так и с компилятором Intel Fortran. У меня нет доступа к другим компиляторам Fortran. Могу ли я разумно ожидать, что другие компиляторы сделают необходимую предварительную обработку исходного кода, если расширение файла .F90? Или я должен полагаться на флаг -cpp? Какой самый портативный способ сделать это? Должен ли я вообще это делать?

+0

Я бы добавил, что вы можете использовать препроцессор CPP напрямую, если он не интегрирован в какой-либо компилятор Fortran. Он включен во все компиляторы C, которые доступны в каждой системе. –

+0

Вы должны быть немного осторожны, используя любой препроцессор C, поскольку у них есть привычка убирать то, что они считают комментариями. Поскольку '//' является допустимым комментарием C или C++, который может иметь неожиданные результаты для любого кода Fortran с конкатенацией символов или конкретных общих или форматированных операторов. – IanH

ответ

4

Разумно ожидать, что имеется подходящий препроцессор «C-like», хотя, несомненно, будут исключения для некоторых компиляторов или инструментов.

Определение переносимости может зависеть от вашей перспективы, но учитывая, что большое количество систем работает с файловой системой, не учитывающей регистр, нецелесообразно полагаться только на случай, чтобы указать, что должен выполняться препроцессор. Большинство связанных с Fortran систем сборки будут иметь некоторый способ сделать эту спецификацию явной.

Отличная идея - это немного более субъективно. Возможно, это только номинально с точки зрения воздействия, но требование препроцессора по-прежнему представляет собой сокращение переносимости и увеличение сложности сборки. В зависимости от компилятора использование препроцессора может препятствовать использованию таких вещей, как стандартная диагностика соответствия.

Следовательно, мое предпочтение относительно простых случаев использования, как это, заключается в том, что утверждение закодировано как обычный источник Fortran - оператор if, который тестирует именованную константу из модуля отладки или аналогичного, вызывая [ОШИБКУ] STOP (не exit) с описательное сообщение, если выражение утверждения терпит неудачу.

USE DebuggingFlags 

IF (debug_flag) THEN 
    IF (x <= 0) ERROR STOP 'negative or zero x in sqrrt!' 
END IF 

Это не даст вам файл и информацию линии, но до тех пор, как вы несколько подобраны с сообщением СТОП соответствующий источник не должен быть слишком трудно найти.

Сборка «Release» производится с постоянной константой отладки, определяемой как ложная (или выбранная вами эквивалентная), и при любой разумной оптимизации оптимизации компилятора объектный код, связанный с утверждением, должен быть идентифицирован и исключен как мертвый.

Но есть за и против.

0

Фортран 95+ имеет условную компиляцию (кокосовый), определенный в стандарте, но только несколько компиляторов поддерживают его. de facto стандарт (так как Fortran 90, я считаю) все еще cpp и fpp, которые большинство компиляторов поддерживают. Оба значения: highly compatible but not 100%. Используя эти факты, в большинстве случаев использование препроцессора стиля cpp/fpp должно быть безопасным.

+1

Коко по существу мертв. Есть мысли о добавлении некоторой макрообработки в Fortran, но они не используют 'coco' в качестве основы. –

0

Добавление к ответу @LeleDumbo:

Насколько я могу судить, Fortran 2008 Стандарт не определяет форму предварительной обработки. Это также означает, что нет стандартного способа указания, как вызвать препроцессор. Однако общепринятой практикой является использование .F90, чтобы указать необходимость предварительной обработки.

Относительно COCO: Третья часть стандарта Fortran ISO 1539-3, которая должна указывать условную компиляцию, была снята.