Включая модуль более одного раза - PullRequest
7 голосов
/ 03 февраля 2012

Предположим, у меня есть модуль, который определяет некоторые основные константы, такие как

integer, parameter :: i8 = selected_int_kind(8)

Если я включу это в свою основную программу, а также включу модуль, который выполняет некоторые другие функции (называют этот модуль functions), но functions также use s constants, тогда я, по сути, включаю constants дважды в моей основной программе?

Если так, это плохо? Может ли вообще быть опасным включать модуль в программу слишком много раз?

1 Ответ

11 голосов
/ 03 февраля 2012

Нет, это нормально.Все, что вы делаете с оператором use, - это предоставление доступа к переменным и функциям, определенным в вашем модуле, через use association .Это не то же самое, что объявлять переменные каждый раз, когда они use 'd (однако, на самом деле они повторно объявлены).

Единственное, что следует опасаться, это круговые зависимости , где модуль A использует модуль B, а модуль B использует модуль A.Это не разрешено

Редактировать: От Меткалфа и др. .Фортран 95/2003 объяснил, стр.72:

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

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

module one_def
  implicit none
  integer, parameter :: one=1
end module one_def

module two_def
  use one_def, only : one
  implicit none
  integer, parameter :: two=one+one
end module two_def

program test
  use one_def, only : one
  use two_def, only : two
  implicit none

  print*, two == one+one ! This prints .True.

end program
...