"Сохранение" общего блока
Я имею дело с некоторым устаревшим кодом, который использует COMMON
блокирует экстенсивно и иногда использует SAVE
заявление. После консультации со стандартом Fortran он говорит:
Появление общего имени блока предшествует и сопровождается косой чертой в
SAVE
Оператор имеет эффект указания всех объектов в этом общем блоке.
При каких обстоятельствах размещение переменной в общем блоке не подразумевает SAVE
? Поскольку переменная должна быть доступна в любом другом программном модуле, который включает этот общий блок, как это может быть SAVE
ред?
2 ответа
Я должен был это найти, потому что у меня было такое же впечатление, как и у вас.
Кажется, что только переменные в неназванном, так называемом пустом, общем блоке сохраняют свое состояние определения во всей программе. Несохраненные переменные в именованном общем блоке становятся неопределенными при возврате из подпрограммы, если только другой активный в данный момент программный модуль не включает общий оператор для того же общего блока.
Из стандарта (Fortran 77, но последний содержит аналогичную формулировку):
17.3 События, которые приводят к тому, что сущности становятся неопределенными
[...]
6. Выполнение оператора RETURN или оператора END в подпрограмме приводит к тому, что все объекты в подпрограмме становятся неопределенными, за исключением следующего:
[...]
д. Объекты в именованном общем блоке, который появляется в подпрограмме и появляется по крайней мере в одном другом программном блоке, который прямо или косвенно ссылается на подпрограмму
Многие компиляторы эпохи Fortran 77 "сохранили" все локальные переменные процедуры, независимо от того, было ли указано "SAVE". Это общая причина того, что устаревшие программы не работают с современными компиляторами, которые отменяют определение переменных, когда они выходят из области видимости, как это допускается стандартом языка. Вероятно, эти старые компиляторы также поддерживали бы значения всех общих переменных в течение всего времени выполнения программы, даже если это не требовалось языковым стандартом.