2017-11-30 29 views
2

프로그램이 디버그 플래그 인 -g을 컴파일하면 추가 정보 로깅을 추가하려고합니다. gfortran을 사용하고 있습니다 (비록 내가 -g이 보편적이라고 생각하기는하지만). 이 경우 프로그램을 밟아 보면 gdb에서 특히 지루할 것입니다.Fortran 프로그램에서 "-g"로 컴파일되었는지 확인하십시오.

if (compiledwithg()) then 
    print *, extraNiceInfo 
endif 

내가 다음 몇 가지 추가 정보를 인쇄, #ifdef DEBUG 같은 물건을 사용하는 것이 일반적으로 C 프로그램의 사람들이 알고 : 특히, 내가 좋아하는 뭔가를 바라고 있어요. 내가 아는 한, Fortran에는 비슷한 기능이 없습니다. 아무도 이것과 같은 것을 알고 있습니까?

+2

프로그램 준수 방법에 대한 자세한 내용 (https://stackoverflow.com/q/46464763/3157076)을 자주 볼 수 있습니다. – francescalus

+2

ifdef DEBUG는 포트란에서도 사용할 수 있습니다! 전처리기를 활성화하십시오. 그 이유는 수표를 사용하지 않을 때 수표를 컴파일하지 않기 때문입니다. –

+0

@Gavin : 항상 true를 반환하는'compiled_with_g()'함수를 사용하여 소스 파일을 만드는 것은 어떻습니까? 어떤 소스 파일을'-g'로 컴파일하고 다른 소스 파일을 컴파일하지 않을 경우, 소스 파일별로이 함수를 생성하는 make 파일에 규칙을 만드는 것은 어떨까요?그러나 전처리기를 사용하는 것은 @Vladimir에 의해 제안되었으며, 확실하게 최상의 솔루션입니다. – mszmurlo

답변

5

질문에 답할 수 있습니다. 예, 현대 버전의 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 인 경우 데드 코드를 제거하므로 매크로처럼 효율적입니다.