상호 운용 가능한 전역 변수

상호 운용 가능한 전역 변수 (Interoperable Global Variables)

Fortran에서 선언한 변수를 C 코드에서 직접 읽거나 써야 할 일이 있을 때가 있어요. C 바인딩 속성(binding attribute)을 사용하면 변수를 C에서 접근 가능하게 만들 수 있어요. 이 글에서는 그 방법을 자세히 살펴볼게요.

출처: Interoperable Global Variables

본문

기본 조건

변수를 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)를 사용해야 해요.

더 알아보기