질문에 답할 수 있습니다. 예, 현대 버전의 Fortran에서는 컴파일에 사용 된 옵션을 알 수 있습니다. francescalus에 의해 링크 된 것처럼, COMPILER_OPTIONS()
서브 루틴은 갈 길입니다.
use iso_fortran_env
logical :: compiled_with_g
character(:), allocatable :: options
options = compiler_options()
compiled_with_g = index(options, "-g") > 0
print *, compiled_with_g
end
및
> gfortran-7 compiled_with_g.f90
> ./a.out
F
> gfortran-7 -g compiled_with_g.f90
> ./a.out
T
주, 그것은 -g
로 시작하거나 문자열 -g
가 포함 된 컴파일러 옵션에 대한 진정한 트리거합니다. " -g "
을 사용해 보았지만이 옵션으로 문자열이 시작되거나 끝날 때 문제가 발생합니다. 이 두 가지 특별한 경우를 if 조건에 추가 할 수도 있습니다.
당신은 어디에서나 #ifdef DEBUG
을 사용할 수 있으며 -cpp
또는 -fpp
이 (컴파일러)에 따라 모든 소스를 컴파일합니다.
또는 당신은 모듈
#ifdef DEBUG
logical, parameter :: compiled_with_g = .true.
#else
logical, parameter :: compiled_with_g = .false.
#endif
에서 글로벌 상수를 정의하고 -cpp
또는 -fpp
그냥이 모듈을 컴파일 할 수 있습니다.
함수 compiledwithg()
을 사용하여 동일한 작업을 수행 할 수 있으며 해당 함수에만 매크로가 있습니다.
또는 당신이 매우 작은 모듈의 두 가지 버전이 있습니다 :
module debug_mod
logical, parameter :: debug = .true.
end module
및
module debug_mod
logical, parameter :: debug = .false.
end module
를 오른쪽 하나를 사용하는 (메이크 같은) 빌드 시스템을 설정합니다. 그런 다음 컴파일러는 매개 변수가 false 인 경우 데드 코드를 제거하므로 매크로처럼 효율적입니다.
프로그램 준수 방법에 대한 자세한 내용 (https://stackoverflow.com/q/46464763/3157076)을 자주 볼 수 있습니다. – francescalus
ifdef DEBUG는 포트란에서도 사용할 수 있습니다! 전처리기를 활성화하십시오. 그 이유는 수표를 사용하지 않을 때 수표를 컴파일하지 않기 때문입니다. –
@Gavin : 항상 true를 반환하는'compiled_with_g()'함수를 사용하여 소스 파일을 만드는 것은 어떻습니까? 어떤 소스 파일을'-g'로 컴파일하고 다른 소스 파일을 컴파일하지 않을 경우, 소스 파일별로이 함수를 생성하는 make 파일에 규칙을 만드는 것은 어떨까요?그러나 전처리기를 사용하는 것은 @Vladimir에 의해 제안되었으며, 확실하게 최상의 솔루션입니다. – mszmurlo