2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
與其搞砸更多的層,不如從Go正確調(diào)用原始C代碼。請(qǐng)參閱 JimB 的評(píng)論或下面的示例。
請(qǐng)注意,原始的C代碼是...不是很好,而且考慮到除了C代碼之外什么都沒(méi)有,使用Go I / O例程可能會(huì)更好,這些例程更安全,更容易正確。想必?zé)o論你擁有什么真正的C代碼都要復(fù)雜得多。您遺漏的部分可能需要對(duì)C和Go都有深入的了解才能連接。
下面是編譯和運(yùn)行(并創(chuàng)建一個(gè)空)的代碼。file.txt
package main
// #include <stdio.h>
// #include <stdlib.h>
// int fileOpen(char *filename, char *mode, FILE **fp) {
// *fp = fopen(filename, mode);
// if (*fp == NULL)
// return -1;
// return 0;
// }
//
// int fileread(FILE *fp, char *buff) {
// if ((fp != NULL) && (fgets(buff, 50, fp) != NULL)) {
// return 0;
// }
// return -1;
// }
//
// int fileclose(FILE *fp) {
// fclose(fp);
// return 0;
// }
import "C"
import (
"fmt"
"unsafe"
)
func opencfile(name string, mode string) (ret int, fp *C.FILE) {
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
cmode := C.CString(mode)
defer C.free(unsafe.Pointer(cmode))
ret = int(C.fileOpen(cname, cmode, &fp))
return
}
func main() {
ret, fp := opencfile("file.txt", "w")
if ret >= 0 {
defer C.fileclose(fp)
}
fmt.Printf("result of opencfile was %d\n", ret)
}

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
我不知道將a從Go傳遞到C的正確語(yǔ)法(如果可能的話(huà))。但是,如果您可以更改C代碼,我建議您不要公開(kāi)對(duì)互操作不兼容類(lèi)型的直接訪問(wèn)。我會(huì)建議更像這樣的東西:FILE**FILE
#include <stdint.h>
typedef uintptr_t fileptr;
int fileOpen(char *filename, char* mode, fileptr *out){
FILE *fp = fopen(filename, mode);
if (*fp == NULL) {
*out = 0;
return -1;
}
*out = (fileptr) fp;
return 0;
}
int fileread(fileptr fp, char *buff){
if( (fp != 0) && (fgets(buff, 50, (FILE*)fp) != NULL) )
return 0;
return -1;
}
int fileclose(fileptr fp){
fclose((FILE*)fp);
return 0;
}
import "C"
...
var fp uintptr
C.fileOpen(..., &fp);
...
c.fileRead(fp, ...);
...
C.fileClose(fp);
- 2 回答
- 0 關(guān)注
- 186 瀏覽
添加回答
舉報(bào)