私は、Fortran コード用のカスタム プリプロセッサがある環境で作業しています。プリプロセッサを使用して、一種の貧弱な関数ポインターとして論理パラメーターを切り替えます。今日、私はこれに似た状況にあることに気づきました:
program main
logical,parameter :: untrue=.false.
if(untrue)then
call func1()
else
call func2()
endif
end
subroutine func2()
print*,"Hello, World!"
end
言い換えれば、func1
どこにも定義されていませんが、これは gfortran (バージョン 4.4 および 4.6) でコンパイルされます。これは、おそらくコンパイラがその呼び出しを最適化するためです。現時点では、チェックする他のコンパイラがありません。このコードは他の場所でコンパイルされますか? これはコンパイラのバグと見なすことができますか?
(コードを含める/含めないのではなく) 論理スイッチを切り替える理由の 1 つは、コンパイラがそのコード ブロック内のインターフェイス/構文 (可能な場合) を引き続きチェックできるようにするためです (単純でないものに対しては適切な警告を発行します)。関数呼び出し)。これは、これらのテストが実行されていないことを意味しますか、それとも関数がリンカによって必要とされていないため、すべて OK を通過することを意味しますか?