상호 운용 가능한 전역 변수
상호 운용 가능한 전역 변수 (Interoperable Global Variables)
Fortran에서 선언한 변수를 C 코드에서 직접 읽거나 써야 할 일이 있을 때가 있어요. C 바인딩 속성(binding attribute)을 사용하면 변수를 C에서 접근 가능하게 만들 수 있어요. 이 글에서는 그 방법을 자세히 살펴볼게요.
본문
기본 조건
변수를 C에서 접근할 수 있게 만들려면 C 바인딩 속성을 사용하면 돼요. 필요에 따라 바인딩 이름(binding name)을 함께 지정할 수도 있어요. 이렇게 만들어진 변수는 아래의 조건을 모두 만족해야 해요.
MODULE의 선언부(declaration part)에 선언되어야 해요.- 상호 운용 가능한 타입(interoperable type)이어야 해요.
pointer속성도,allocatable속성도 가지면 안 돼요.
사용 예
예시를 통해 이해해 볼게요. 아래는 모듈 m 안에 C와 상호 운용되는 변수 두 개를 선언하는 코드예요.
MODULE m
USE myType_module
USE ISO_C_BINDING
integer(C_INT), bind(C, name="_MyProject_flags") :: global_flag
type(myType), bind(C) :: tp
END MODULE
여기서 이름의 규칙을 잘 봐야 해요. _MyProject_flags는 C 프로그램 입장에서 보이는, 대소문자를 구분하는(case-sensitive) 이름이에요. 반면 global_flag는 Fortran 입장에서 보이는, 대소문자를 구분하지 않는(case-insensitive) 이름이에요.
tp처럼 바인딩 이름을 지정하지 않으면, C 바인딩 이름은 Fortran 바인딩 이름을 소문자로 바꾼 값이 돼요. 그리고 바인딩 이름을 지정하는 경우에는 이중 콜론(::) 뒤에 변수 하나만 올 수 있어요.
errno 주의사항
한 가지 주의할 점이 있어요. 전역 변수를 사용해서 C 라이브러리의 errno에 접근하려고 하면 안 돼요. C 표준이 errno가 매크로일 수 있도록 허용하고 있기 때문이에요. 그 대신 GNU 확장인 IERRNO 내장 함수(intrinsic)를 사용해야 해요.
더 알아보기
- 기본 타입을 C 타입과 정확히 맞추는 방법은 Intrinsic Types 문서에서 확인할 수 있어요.
- 서브루틴과 함수를 C와 연동하는 방법은 Interoperable Subroutines and Functions 문서를 참고해 보세요.
- C와의 전체적인 상호 운용 개요는 Interoperability with C 문서에서 다뤄요.