Golang에서 C 사용하기

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 같이 화면에 출력하는거는 제어권이 메인 프로그램 종료될때까지 받아오질 못하는건지… 자세한건 모르겠네.
이 글 보시는 분중 아시는 분은 댓글 부탁드립니다.


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다