C 언어에서 Go 언어 함수 사용하기




이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07




이번에는 C 언어에서 Go 언어의 함수를 사용해보겠습니다. 다음은 Go 언어의 덧셈 함수를 사용하여 두 수를 더합니다.

package main

/*
#include <stdio.h>

extern int sum(int a, int b); // Go 언어의 함수는 extern으로 선언

static inline void CExample() {
	int r = sum(1, 2); // Go 언어의 sum 함수 호출
	printf("%d\n", r);
}
*/
import "C"

//export sum
func sum(a, b C.int) C.int { // C 언어에서 사용할 수 있도록 매개변수와 리턴값 자료형을
                             // C 언어용으로 맞춰줌
	return a + b
}

func main() {
	C.CExample()
}

실행 결과

3

먼저 Go 언어에서 덧셈 함수를 작성합니다.

//export sum
func sum(a, b C.int) C.int { // C 언어에서 사용할 수 있도록 매개변수와 리턴값 자료형을 C 언어용으로 맞춰줌
	return a + b
}

C 언어에서 매개변수를 넣고, 리턴값을 사용할 수 있도록 매개변수와 리턴값의 타입을 각각 C.int로 지정합니다. C.int는 C 언어의 int 자료형이며 Go 언어의 int와는 다른 자료형입니다.

함수 정의 윗 부분에 //export 함수명 형식으로 주석을 작성합니다. 이 주석이 있어야 C 언어에서 Go 언어의 함수를 사용할 수 있습니다. 그리고 // 뒤에는 띄어쓰지 않고 붙여줍니다. 여기서는 sum 함수이므로 //export sum입니다.

주석 부분에서 C 언어 코드를 작성합니다.

/*
#include <stdio.h>

extern int sum(int a, int b); // Go 언어의 함수는 extern으로 선언

static inline void CExample() {
	int r = sum(1, 2); // Go 언어의 sum 함수 호출
	printf("%d\n", r);
}
*/
import "C"

extern int sum(int a, int b);으로 외부에 sum 함수가 있다는 것을 알려줍니다. 여기서 외부는 Go 언어입니다. 그리고 CExample 함수에서 Go 언어의 sum 함수로 두 수를 더한 다음 결과를 출력합니다.

Go 언어에서 함수를 //export로 설정한 뒤 주석 형식으로 C 언어 함수를 작성할 때는 반드시 static inline으로 지정해줍니다. static inline이 아닌 일반 함수로 작성하면 “multiple definition of ~” 에러가 발생합니다.

마지막으로 Go 언어에서 C.CExample을 실행합니다.

func main() {
	C.CExample()
}

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015