swig 之 go 語言呼叫c,多引數返回

2021-08-25 14:10:00 字數 2269 閱讀 6178

由於任務的原因,有乙個專案需要用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...