Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免错误;StaticFunction必须采用未绑定的…“;在Kotlin Native中,何时从C调用Kotlin回调函数?_Kotlin_Kotlin Native - Fatal编程技术网

如何避免错误;StaticFunction必须采用未绑定的…“;在Kotlin Native中,何时从C调用Kotlin回调函数?

如何避免错误;StaticFunction必须采用未绑定的…“;在Kotlin Native中,何时从C调用Kotlin回调函数?,kotlin,kotlin-native,Kotlin,Kotlin Native,这是一个关于回调函数的一般性问题,在Kotlin Native中定义,由C函数调用 为了便于讨论,假设我正在尝试递归地遍历文件系统中的目录,在Kotlin Native中使用。 (我知道还有其他方法可以做到这一点,使用其他C函数,但这不是问题的核心。) nftw()将函数作为回调函数: val directory = "//some/directory" val callback = kotlinx.cinterop.staticCFunction { file: CPo

这是一个关于回调函数的一般性问题,在Kotlin Native中定义,由C函数调用

为了便于讨论,假设我正在尝试递归地遍历文件系统中的目录,在Kotlin Native中使用。 (我知道还有其他方法可以做到这一点,使用其他C函数,但这不是问题的核心。)

nftw()将函数作为回调函数:

val directory = "//some/directory"
val callback = kotlinx.cinterop.staticCFunction {
            file: CPointer<ByteVar>?,
            stat: CPointer<stat>?,
            typeFlag: Int,
            b: CPointer<FTW>? ->

            val fileName = file?.toKString()
            println(fileName)
            val result = 0
            result
        }

val depth = 10
val flags = 0
platform.posix.nftw(directory, callback, depth, flags)
val directory=“//some/directory”
val callback=kotlinx.cinterop.staticf函数{
文件:CPointer?,
统计:CPointer?,
typeFlag:Int,
b:CPointer?->
val fileName=文件?.toKString()
println(文件名)
val结果=0
后果
}
val深度=10
val标志=0
platform.posix.nftw(目录、回调、深度、标志)
这适用于通过“println()”列出文件,但只要lambda包含任何捕获的值,就会出现以下编译器错误:

“kotlinx.cinterop.staticf函数必须采用未绑定的非捕获函数或lambda”

我的问题是:有没有关于如何 从这样的回调访问任何非全局状态


我确实用一个全局变量想出了一个糟糕的解决办法,所以这不是我主要想要的。如果有一个普遍接受的解决方案使用@ThreadLocal或其他方法,请讨论。

对于一般的本机回调(不特定于
nftw
)。C函数应该接受一个
void*userData
参数,并在调用时将其传递给回调函数。这允许您向回调传递本地数据,而不是全局数据。 即使在C/C++中也是如此

对于这种特殊情况(不管语言如何),没有一些全局数据(或JIT,但我们不要考虑它),实际上没有一种方法可以做到这一点。因此,任何解决办法都必须是令人讨厌的

使用
@ThreadLocal
是一个“合理的”解决方案


nftw
不是一个设计良好的C接口。

通常用于本机回调(不特定于
nftw
)。C函数应该接受一个
void*userData
参数,并在调用时将其传递给回调函数。这允许您向回调传递本地数据,而不是全局数据。 即使在C/C++中也是如此

对于这种特殊情况(不管语言如何),没有一些全局数据(或JIT,但我们不要考虑它),实际上没有一种方法可以做到这一点。因此,任何解决办法都必须是令人讨厌的

使用
@ThreadLocal
是一个“合理的”解决方案

nftw
不是一个设计良好的C接口