2016-01-20 3 views
0

Когда я запустил этот код, я ожидал результата печати, например A: 4, B: 89. Но на самом деле ничего не отображает.Не отображает результат printf в cgo

Почему эта программа не отображает результат для стандартного вывода?

main.go:

package main 

/* 
#include "c.h" 

*/ 
import "C" 

import (
    "unsafe" 
) 

type S struct { 
    A int 
    B int 
} 

func main() { 
    s := &S{A: 4, B: 89} 
    pass_to_c := (*C.S)(unsafe.Pointer(s)) 
    C.gostruct(pass_to_c) 
} 

c.h

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    long int A; 
    long int B; 
} S; 

extern void gostruct(S *struct_s) { 
    printf("A: %ld, B: %ld\n", struct_s->A, struct_s->B); 
} 
+1

The Go 'структура S' и C структура' S', очень вероятно, не совместимы с вашей системой. Вы не можете рассматривать указатель на один как указатель на другой. Вместо этого создайте объект типа структуры C - вы можете создавать и использовать структуру C непосредственно из Go. – andlabs

+0

Используйте типы определенного размера, такие как 'int64', в структуре, которая должна соответствовать структуре C. В этом случае используйте int64 или получите структуру из определения C. Поскольку вы не можете получить доступ к структурам typedef через cgo, обычно нужно сделать оболочку C для доступа к ним, а не сопоставлять структуру вручную в Go. Таким образом вы можете позволить cgo генерировать их автоматически, а не вручную проверять размер и выравнивание. – JimB

ответ

0

Спасибо за комментарии.

я получил ожидаемый результат с ниже кодов

main.go:

package main 

/* 
#include "c.h" 

*/ 
import "C" 

import (
    "unsafe" 
) 

type S struct { 
    A int64 // 64bit int 
    B int64 // 64bit int 
} 

func main() { 
    s := &S{A: 4, B: 89} 
    pass_to_c := (*C.S)(unsafe.Pointer(s)) 
    C.gostruct(pass_to_c) 
} 

c.h:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    long long int A; // 64bit int 
    long long int B; // 64bit int 
} S; 

extern void gostruct(S *struct_s) { 
    printf("{A: %lld, B: %lld}\n", struct_s->A, struct_s->B); 
} 

Я полагаю, структура поля должны использовать тот же тип между языками. В вопросительном коде тип структурных полей не одинаковый. (C struct: 32bit int, Go struct: 64bit int)

Код ответа, поле структуры совпадает с языком. (как структура: 64bit целое)

Обратите внимание, что моя архитектура darwin/amd64

+0

Это все еще неправильный ответ. В Windows это не удастся. Правильный ответ - создать 'C.S' и использовать его напрямую; не пытайтесь заставить структуру Go, элементы которой определенно будут иметь разный размер или выравнивание в C-структуру. – andlabs