This documentation对我来说还很不清楚,它试图说什么是${type}Var
。
...对于Kotlin枚举,它被命名为
${type}Var
是吗?什么是Kotlin枚举?普通的Kotlin枚举?
enum class MyEnum {
FIRST, SECOND
}
我认为这并不暗示。
好的,让我们看一下本文档中的示例:
struct S*
映射到CPointer<S>
,int8_t*
映射到CPointer<int_8tVar>
好吧,很明显
char**
映射到CPointer<CPointerVar<ByteVar>>
为什么char**
映射到CPointer<CPointerVar<ByteVar>>
而不是CPointer<CPointer<Byte>>
?
所以最后一个问题是:IntVar
,LongVar
,CPointerVar<T>
和诸如${type}Var
之类的其他东西是什么?
答案 0 :(得分:2)
您应该再次仔细阅读整个段落。
所有受支持的C类型在Kotlin中都有相应的表示形式
- 枚举可以映射到Kotlin枚举
在C中也有左值和右值(在C ++中,对等值是Type &
,对于右值是Type
)。主要区别是左值可以设置为某个值,而右值在初始化后不能更改。因此,对于C中的每种类型,您都需要为左值和右值使用自己的Kotlin类型。
在主题中
所有受支持的C类型在Kotlin中都有相应的表示形式
仅考虑右值。
但是对于左值,您只需添加Var
到类型末尾即可。唯一的例外是
对于结构体(和对结构体的typedef),此表示形式是主要的表示形式,与结构体本身具有相同的名称
现在让我们回到枚举。常规Kotlin枚举映射到常规C枚举。因此实际上FIRST
和SECOND
在两种语言中的类型均为MyEnum
。但是,如果要创建一个包含MyEnum
的变量,例如:
// This is C Code
MyEnum a = FIRST;
a
在C中的类型为MyEnum
,但它是左值(在C ++中为MyEnum &
),因此在Kotlin中,a
的类型为MyEnumVar
,因为完全是文档中所说的内容:${type}Var
,其中${type} = MyEnum
。
接下来的问题:
CPointer的类型参数T必须是“左值”类型之一
因此对于struct S*
,它应该是CPointer<SVar>
,但是请记住,struct
是个例外,我们不应该添加Var
,所以只是CPointer<S>
。
int8_t*
是CPointer<int_8tVar>
-这里也不例外。 char*
是CPointer<ByteVar>
-同样也不例外(仅左值类型,结构除外)。 char**
是CPointer<CPointerVar<ByteVar>>
,因为我们需要CPointer<ByteVar>
的左值,而正好是CPointerVar<ByteVar>
。最后:
IntVar
,LongVar
,CPointerVar<T>
和其他事物是类型int
,long
,CPointer
的左值。如果要更改函数中的对象,可能需要这样做。 Java中的Ref<${type}>
之类的东西。
答案 1 :(得分:1)
IntVar
,LongVar
,CPointerVar<T>
和${type}Var
之类的其他东西是什么?
那是在句子的开头,在句子的结尾加上引号:
表示此类型左值的Kotlin类型,即位于内存中的值,而不是简单的不可变的自包含值
“位于内存中”意味着您可以获取其地址(在C语言中使用&
运算符,在Kotlin中使用.ptr
)。
是吗?什么是Kotlin枚举?普通的Kotlin枚举?
是的,因此当Kotlin / Native看到MyEnum
时,它还会生成MyEnumVar
。
为什么
char**
映射到CPointer<CPointerVar<ByteVar>>
而不是CPointer<CPointer<Byte>>
?
CPointer<CPointer<Byte>>
是非法的:CPointer
's type parameter must extend CPointed
,而Byte
和CPointer<T>
则不是。他们需要扩展CPointed
的原因是因为取消引用指针会产生一个左值:具有地址的东西!
有关C(和C ++)中的左值的更多信息,请参见https://docs.microsoft.com/en-us/cpp/c-language/l-value-and-r-value-expressions或https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/。