가장 빨리 만나는 Go 언어 Unit 62.1 Go 언어에서 C 언어 함수 사용하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

C 언어 연동하기


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


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

먼저 Go 언어에서 C 언어의 rand 함수를 사용해보겠습니다(정확하게 사용하려면 srand 함수에 seed 값을 넣어주어야 하지만 여기서는 C 언어 함수를 연동하는 것이 목적이므로 간단하게 rand 함수만 사용하겠습니다).

package main

/*
#include <stdlib.h>
*/
import "C"
import "fmt"

func main() {
	r := C.rand() // stdlib의 rand 함수 호출

	fmt.Println(r) // 결괏값 출력
}

rand 함수를 사용하려면 다음과 같이 주석 안에 #include <stdlib.h>처럼 헤더 파일을 포함합니다. 그리고 주석 바로 밑에 import "C"를 넣어줍니다. 이때 주석과 import "C" 사이에 새 줄이 있거나 다른 코드가 있으면 안 됩니다.

/*
#include <stdlib.h>
*/
import "C"

C 언어 함수들은 항상 C.으로 시작합니다. 그러므로 C 언어의 rand 함수는 C.rand처럼 사용하면 됩니다.

r := C.rand() // stdlib의 rand 함수 호출

fmt.Println(r) // 결괏값 출력

소스 파일을 컴파일한 뒤 실행해보면 다음과 같이 rand 함수의 리턴값이 출력됩니다(물론 seed 값을 설정하지 않았으므로 실행할 때마다 계속 같은 값이 나올 것입니다).

실행 결과
41 (랜덤)

이번에는 C 언어로 직접 만든 함수를 사용해보겠습니다.

package main

/*
#include <stdio.h>

int sum(int a, int b) // 덧셈 함수 작성
{
	return a + b;
}

void hello() // Hello, world! 출력 함수 작성
{
	printf("Hello, world!\n");
}
*/
import "C" // 주석으로 작성한 C 언어 코드 아래에 import "C"를 넣어줌
import "fmt"

func main() {
	var a, b int = 1, 2
	r := C.sum(C.int(a), C.int(b)) // C 언어 함수 sum 호출
	fmt.Println(r)                 // 3

	C.hello() // Hello, world!
}

먼저 Go 언어 소스 파일 안에서 주석으로 C 언어 함수를 작성합니다. 그리고 주석 바로 밑에는 반드시 import "C"를 넣어줍니다.

/*
#include <stdio.h>

int sum(int a, int b) // 덧셈 함수 작성
{
	return a + b;
}

void hello() // Hello, world! 출력 함수 작성
{
	printf("Hello, world!\n");
}
*/
import "C" // 주석으로 작성한 C 언어 코드 아래에 import "C"를 넣어줌

C 언어로 코드를 작성할 때 별다른 제약은 없으며 기존과 동일하게 함수를 작성하면 됩니다. 여기서는 두 정수를 더하는 함수와 stdio.h 헤더 파일의 printf 함수를 사용하여 문자열을 출력하는 함수를 작성했습니다.

다음과 같이 작성된 C 언어 함수는 C.sum, C.hello처럼 사용하면 됩니다.

var a, b int = 1, 2
r := C.sum(C.int(a), C.int(b)) // C 언어 함수 sum 호출
fmt.Println(r)                 // 3

C.hello() // Hello, world!

Go 언어의 자료형을 C 언어 함수에 넣으려면 먼저 변환을 해주어야 합니다. 여기서는 Go 언어의 int 형 변수를 C.int로 변환했습니다(C.int 뿐만 아니라 C.schar, C.uchar, C.uint, C.double, C.float, C.short, C.ushort, C.long, C.ulong 등으로 변환할 수 있습니다).


저작권 안내

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

Published

2015-06-01