当前位置: 首页 > 面试题库 >

无法访问CGO中的C变量

何雅惠
2023-03-14
问题内容

我正在尝试在cgo中访问ac struct,但是要这样做

无法确定C.utmpx的名称种类

utmpx是结构

这是执行代码:

/*
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>
*/
import "C"

type record C.utmpx

fd, err := os.Open(C._PATH_UTMPX) // this works
fd, err := os.Open(C.UTMPX_FILE)  // error

在utmpx.h文件中,有

 #define    _PATH_UTMPX     "/var/run/utmpx"
 #define    UTMPX_FILE  _PATH_UTMPX

我可以使用_PATH_UTMPX,但在使用UTMPX_FILE时也会收到相同的警告,为什么?

看来我无法访问在.h文件中声明的这些变量,该怎么办?

平台:macOS sirria,go 1.8


问题答案:
package main

import "os"

/*
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <utmpx.h>
#include <fcntl.h>
#include <unistd.h>

char *path_utmpx = UTMPX_FILE;

typedef struct utmpx utmpx;
*/
import "C"

type record C.utmpx

func main() {
    path := C.GoString(C.path_utmpx)
    fd, err := os.Open(path)
    if err != nil {
        panic("bad")
    }
    fd.Close()
}
  1. 我必须定义_GNU_SOURCE才能获得UTMPX_FILE定义。
  2. 我不得不创建path_utmpx变量来解决CGo的#define问题。
  3. 我必须执行typedef才能进行type record C.utmpx编译。
  4. 使用Go,您不能直接使用C字符串。您必须将它们转换为Go字符串。同样,如果要使用Go字符串调用C函数,则必须将它们转换为C字符串(并释放堆中分配的空间)。

一些提示:

  • https://blog.golang.org/c-go-cgo
  • https://golang.org/cmd/cgo/

祝好运!



 类似资料:
  • 问题内容: 我有服务 即使在控制器中也可访问 有人可以解释一下为什么在angular.foreach中无法访问“ this.list”吗?如何访问“ this.list”? 问题答案: (请参阅http://docs.angularjs.org/api/angular.forEach)函数中的最后一个参数是的上下文。因此,您需要这样的东西:

  • 我得到以下错误,我不确定问题是什么 1智能感知:“标准::基本团队” 书cpp 我得到了 书H 我甚至不明白错误告诉了我什么

  • 我有一个对象类,其中有几个字段和方法,我可以在when子句中成功访问这些字段和方法: 这类似于我的口水规则的结构: IntelliJ立即抱怨说它无法解析符号$对象。仅当我执行以下操作时,该变量似乎才可访问,但无法从包装器上下文外部访问getObject()方法。 在使用drools框架时,处理变量的正确方法是什么?是否可以在包装器外部声明变量,然后在包装器内部更改其值? 上面代码工作的项目中还有其

  • 问题内容: 我认为这是异步的问题,但我不知道解决方案。 我的问题是,如果我尝试在函数外部访问它,则返回undefined,并且我不知道如何在页面上显示表格。 问题答案: 问题是Selling.find是异步的,可能在执行this.table = table时尚未完成。尝试类似以下的方法。 这将确保在获取结果并填充表之后才使用表。

  • 我正在尝试使用update:在执行变异后更新查询。问题是存储区中的查询应用了几个不同的变量,我想更新查询并使用相同的变量返回它。 我在文档中发现,updateQueries有一个选项可以包含queryVariables,queryVariables是执行查询时使用的最后一组变量。 我没有找到任何描述如何从更新内部检索queryVariables或类似内容的内容。 更新内部:我可以使用 它将返回一个

  • 问题内容: 我正在使用FFmpeg为Windows平台编写一个应用程序,它是golang包装器goav,但是我在理解如何使用C指针获取对其所指向的数据数组的访问方面遇到了麻烦。 我正在尝试获取存储在AVFrame类中的数据,并使用Go将其写入文件,最后使用OpenGl中的纹理使视频播放器具有出色的过渡效果。 我认为了解如何转换和访问C数据将使编码变得容易得多。 我已经删除了C代码的所有相关部分,包