在cgo中不显示printf结果

问题描述 投票:0回答:3

当我运行这段代码时,我希望打印出类似

A: 4, B: 89
的结果。 但实际上,什么也不显示。

为什么这个程序不将结果显示到标准输出?

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);
}
c go cgo
3个回答
2
投票

感谢您的评论。

我可以用下面的代码得到预期的结果

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 结构:32 位 int,Go 结构:64 位 int)

在答案代码中,不同语言的结构字段是相同的。 (两个结构:64位int)

请注意,我的架构是

darwin/amd64


1
投票

我在LiteIDE中运行程序,不显示c printf输出。

但是在终端中运行相同的程序, 然后显示 c printf 输出。


0
投票

"console": "integratedTerminal"
添加到 vscode
launch.json
解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.