由於任務的原因,有乙個專案需要用go語言呼叫c**。之前有接觸過swig,因此直接上官網去swig,果不其然,它是支援go語言的,二話不說,直接搞起。
好了下面開始正題。
文件第乙個列子就是
% swig -go -cgo -intgosize 32 example.i
需要注意的文件要求把**檔案放入 gopath/src。這個為了讓你後面 import的時候直接加入包名而方便的,你可以不需要這麼做。直接在自己希望的目錄中,執行上面的**。
首先,目錄有的檔案為:example.c example.i。直接執行
% swig -go -cgo -intgosize 32 example.i
然後,你會得到 example.go example_wrap.c。其中example_wrap.c 是對example.c的再一次封裝,為了更好的讓go語言呼叫c**,做了很多go與c型別的處理。然後,example.go就是直接讓其他go語言呼叫的函式介面,即當main.go 呼叫example.go的函式時,example.go 會呼叫 example_wrap.c,然後example_wrap.c會呼叫example.c。
可能我寫的不太清楚,如果您希望有更清楚的,可以去找更詳細的資料,或者直接看官網的資料。
這裡有乙個特殊的情況
/* file : example.c */
#include #include #include void test_a(int *p, int *q, int m, int m, int n,int n)
for (int i = 0; i < n; i++)
}
我希望能在go中呼叫該c函式,傳入兩個int陣列p 和 q 並返回該陣列的修改值。
在看了swig的官網的介紹之後,查到了官網的例子swing and go example,然後通過查詢資料修改example.i,成功呼叫。
/* file : example.i */
%module example
%%typemap(gotype) int *p ,int *q "int32"
%typemap(in) (int *p),(int *q)
%extern void test_a(int *p, int *q, int m, int m, int n,int n);
%typemap(gotype) int *p , int *q "int32"
該語義為,將 int* p 和 int *q 的c**函式中的引數的型別替換為go的int32;
func test_a (arg1 int32, arg2 int32, arg3 int, arg4 int, arg5 int, arg6 int)
該語義是告訴example_wrap.c,在go的陣列和c的陣列之間要做的處理。
我們知道,在swig會定義乙個結構體
typedef struct _goslice_;
用於轉換go的陣列與c的陣列。
因此,我們真正的陣列指標是array,len是陣列長度,因此我們需要獲得它。最終swig生成的**如下
void _wrap_test_a_example_a6e85fed6d990a5b(_goslice_ _swig_go_0, _goslice_ _swig_go_1, intgo _swig_go_2, intgo _swig_go_3, intgo _swig_go_4, intgo _swig_go_5)
swing 其實很強大,還有很多未知等待大家去探索。
下面給出,剩下的例子
├── example
│ ├── example.c
│ ├── example.go
│ ├── example.i
│ └── example_wrap.c
├── testmain.go
package main
import (
"fmt"
"./example"
)func main()
qs := int32
example.test_a(ps,qs,ctx,100, 8, 1000, 8)
fmt.println(ps)
fmt.println(qs)
}
C語言多檔案引數傳遞
區域性變數只作用於函式或復合語句內部,此處不予討論。這裡主要考慮的是全域性變數及函式在多個檔案模組之間的傳遞 全域性變數在某個檔案模組中定義後,若要在其他檔案中使用,需要在使用前新增外部變數宣告 extern 型別 變數名 型別名可省略,但可能會有warning否則 若要使全域性變數僅在所在的檔案可...
C語言函式引數呼叫順序
浩然君前幾天發過乙個小檔案 關於函式引數的呼叫順序的 int arr int ptr arr ptr 123 printf d d ptr,ptr 輸出 8 8 函式引數入棧的順序,一般vc的編譯器是從右往左入棧,那麼這個運算也自然是從右往左。ptr之後ptr再次向後乙個位置移動,即a 2 8。前面...
go語言與c語言的相互呼叫
由於工作原因,需要實現go語言與c語言的相互呼叫。由於go語言與c語言有著千絲萬縷的曖昧關係,兩者之間的呼叫可以通過語言層面實現。下文是對此的總結。go語言呼叫c語言 以下為乙個簡短的例子 package main include include void print char str import...