gpt4 book ai didi

指向函数的 C typedef [c 语法]

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:53 25 4
gpt4 key购买 nike

所以我通常用 java 和 Go 编程,所以我为我的无知感到抱歉,我已经学习了基本的 c 和 c++。然而,在使用 JNI 时,我遇到了这个 C 代码。

(*env)->ReleaseStringUTFChars(env, javaString, nativeString);

我想知道为什么 (*env) 指向一个函数。根据我的理解,env 只是一个结构,在 C 函数中并不依赖于变量,就像类在 C++ 和 JAVA 中的工作方式一样。

我是否遗漏了 C 中允许函数仅针对结构触发的内容?

有点像围棋

type House struct { }

func (h House) GetHouseName() string { } //method defined outside of struct, but works on House

不幸的是,我不确定如何表达我在找你的东西谷歌并没有真正出现太多,我在 C 上订购的书要到下周才会出现。

感谢您的帮助!

最佳答案

不,在您的示例中,env 必须是指向结构指针的指针,其中包含指向函数 (!) 的指针。

类似的东西:

struct MyEnvironment
{
void (*ReleaseStringUTFChars)(MyEnvironment **env, /*...*/);
};

int main()
{
MyEnvironment *theEnv = AllocEnvironment();

MyEnvironment **env = &theEnv;

(*env)->ReleaseStringUTFChars(env, ...);
}

(稍后进行一些 Google 搜索...)

碰巧,在 JNI 中有一个小的 typedef:

typedef const struct JNINativeInterface* JNIEnv;

env定义为:

JNIEnv *env;

正如我猜测的那样,这实际上是一个指针到指针到结构的指针。

C 函数的问题在于它们缺少成员函数的概念,因此它们必须为调用该函数的对象包含一个显式参数。

在 JNI 中,有一个奇怪的预编译器技巧可以同时使用具有相同 header 和相同二进制接口(interface)但语法完全不同的 C 和 C++。例如,您的 C 调用:

(*env)->ReleaseStringUTFChars(env, javaString, nativeString);

在 C++ 中是:

env->ReleaseStringUTFChars(javaString, nativeString);

这会起作用,因为在 C++ 中 env 不是指向指针的指针,而是指向此类类型的指针:

struct JNIEnv
{
const struct JNINativeInterface* functions;

/* inline function: no code generated */
void ReleaseStringUTFChars(jstring string, const char* utf)
{
functions->ReleaseStringUTFChars(this, string, utf);
}
/* a lot of other functions... */
};

由于此类有一个指向结构指针类型的成员,它与这样的指针二进制兼容,可以在 C++ JNIEnv 和 C struct JNINativeInterface 之间转换* 没有问题。

关于指向函数的 C typedef [c 语法],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com