인자 목록 함수 %VAL·%REF·%LOC
인자 목록 함수 %VAL·%REF·%LOC (Argument list functions)
g77과의 하위 호환을 위해 제공되는 %VAL, %REF, %LOC라는 인자 목록 함수를 소개해요. 값·참조·메모리 위치 중 어떤 방식으로 인자를 넘길지 제어할 수 있어요.
본문
GNU Fortran은 g77과의 하위 호환을 위해 인자 목록 함수(argument list function) %VAL, %REF, %LOC 문을 지원해요. 다만 이 함수들은 GNU Fortran 밖의 기능(운영체제나 윈도잉 기능 등)에 접근하는 코드에서만 쓰는 것을 권장해요. 그리고 그런 용도도 프로그램에서 격리된 일부 부분으로 한정하는 게 좋아요 — 즉 저수준·시스템 의존 기능만을 특별히 다루는 부분이요. 그런 부분이 프로그램 전체를 위해 이식 가능한 인터페이스를 제공할 수는 있지만, 그 자체는 이식 가능하지 않으므로, 새 컴파일러나 새 버전의 컴파일러로 다시 빌드할 때마다 철저히 테스트해야 해요.
각 함수의 동작은 이래요.
%VAL— 스칼라 인자를 값으로 전달%REF— 인자를 참조로 전달%LOC— 인자의 메모리 위치를 전달
gfortran은 이미 스칼라 인자를 참조로 전달하기 때문에, %REF는 사실상 아무 일도 하지 않는 셈이에요. 그리고 %LOC는 포트란 포인터와 같은 효과를 가져요.
C 서브루틴 foo에 인자를 값으로 전달하는 예시를 볼게요.
C
C prototype void foo_ (float x);
C
external foo
real*4 x
x = 3.14159
call foo (%VAL (x))
end
여기서 %VAL(x) 덕분에 x의 값이 그대로 C 쪽 float x로 넘어가요. %VAL 없이 call foo(x)를 하면 참조(포인터)로 전달되니까, C 프로토타입도 그에 맞춰 float*로 써야겠죠.
자세한 내용은 g77 매뉴얼(https://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/index.html#Top)을 참고하면 돼요. GNU Fortran 테스트수트의 c_by_val.f와 그 짝인 c_by_val.c도 볼 만해요.
더 알아보기
- g77 인자 전달 매뉴얼
- GNU Fortran 인자 전달 규약
- ISO_C_BINDING을 통한 C와의 상호운용