golang으로 DLL 만들어서 다른 언어에서 사용하는법을 알아보다가 golang 안에서 C로 작성한 코드를 바로(?) 쓸수 있다는걸 보고 한번 해봄.
package main /* //사용할 C 코드는 주석으로 작성해야 한다. #include <stdio.h> int test(int a, char* b){ printf("%s=%d", b, a); return 111; } */ import "C" import "fmt" func main() { ret := C.test(33, C.CString("abc")) fmt.Printf("ret=%dn", ret) }
go 안에서 C 코드 쓰는게 무슨 장점이 있는지는 잘 모르겠군.
레거시 코드를 그냥 재활용 할수 있다는건가???
테스트 해보다가 한가지 특이한걸 알게 됬는데 함수 호출 순서가 코드 순서 그대로가 아니라 go코드 먼저 그 뒤에 C코드가 실행된다.
package main /* //사용할 C 코드는 주석으로 작성해야 한다. #include <stdio.h> int test(int a, char* b){ printf("%s=%dn", b, a); return a+5; } void test2(){ printf("=test=n"); } */ import "C" import "fmt" func aaa() { C.test(4, C.CString("abc4")) } func bbb() { C.test2() } func main() { bbb() cInts := []C.int{0, 0, 0} cInts[0] = C.test(1, C.CString("abc1")) bbb() cInts[1] = C.test(2, C.CString("abc2")) aaa() cInts[2] = C.test(3, C.CString("abc3")) fmt.Printf("return 0=%dn", cInts[0]) fmt.Printf("return 1=%dn", cInts[1]) fmt.Printf("return 2=%dn", cInts[2]) }
위와 같은 코드일때 단순하게 생각했을때
=test= abc1=1 =test= abc2=2 abc4=4 abc3=3 return 0=6 return 1=7 return 2=8
이런 순서대로 나올거라 예상했는데 실제로는
이런식으로 나온다.
break 찍고 보니 main함수가 종료된 후에 =test= 가 찍히는걸 확인했다.
리턴값 잘 받아오는거 보면 내부적으로 연산이 됬다는건 확인이 되는데 printf 같이 화면에 출력하는거는 제어권이 메인 프로그램 종료될때까지 받아오질 못하는건지… 자세한건 모르겠네.
이 글 보시는 분중 아시는 분은 댓글 부탁드립니다.
답글 남기기