3

它试图说出什么是${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,LongVarCPointerVar<T>其他类似的东西${type}Var

4

2 回答 2

2

你应该再仔细阅读整个段落。

所有支持的 C 类型在 Kotlin 中都有对应的表示:

  • 枚举可以映射到 Kotlin 枚举

在 C 中也有左值和右值(在 C++ 中,等价于左值Type &Type右值)。主要区别是左值可以设置为某个值,而右值在初始化后不能更改。因此,对于 C 中的每种类型,左值和右值都需要它自己的 Kotlin 类型。

在主题

所有支持的 C 类型在 Kotlin 中都有对应的表示:

只考虑右值。但是对于左值,您唯一需要添加的是Var类型的结尾。唯一的例外是

对于结构(以及结构的类型定义),此表示是主要表示,并且与结构本身具有相同的名称

现在让我们回到枚举。常规的 Kotlin 枚举映射到常规的 C 枚举。所以实际上FIRST并且SECONDMyEnum两种语言的类型。但是如果你想创建一个包含MyEnum例如的变量怎么办:

// This is C Code
MyEnum a = FIRST;

a在 C 中具有类型MyEnum,但它是左值(在 C++ 中是MyEnum &),因此在 Kotlina中将具有类型MyEnumVar,因为这正是文档中所说的:${type}Var, where ${type} = MyEnum.

到下一个问题:

CPointer 的类型参数 T 必须是“左值”类型之一

所以struct S*它应该是CPointer<SVar>,但请记住structs 是例外,我们不应该添加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。如果您想更改函数中的对象,则可能需要这样做。类似Ref<${type}>Java的东西。

于 2019-03-19T20:47:24.830 回答
1

IntVar,LongVarCPointerVar<T>其他类似的东西是什么${type}Var

那是您引用的句子的开头:

Kotlin 类型,表示该类型的左值,即位于内存中的值而不是简单的不可变自包含值

“位于内存中”意味着您可以获取它们的地址(&在 C 或.ptrKotlin 中使用运算符)。

笏?!什么是 Kotlin 枚举?常规的 Kotlin 枚举?

是的,所以当 Kotlin/Native 看到 时MyEnum,它也会生成MyEnumVar.

为什么char**映射到CPointer<CPointerVar<ByteVar>>但不映射到CPointer<CPointer<Byte>>

CPointer<CPointer<Byte>>是非法的:CPointer的类型参数必须扩展CPointed,并且Byte不要CPointer<T>。他们需要扩展的原因CPointed是因为取消引用指针会给出一个左值:有地址的东西!

请参阅https://docs.microsoft.com/en-us/cpp/c-language/l-value-and-r-value-expressionshttps://eli.thegreenplace.net/2011/12/15/understanding -lvalues-and-rvalues-in-c-and-c/了解更多关于 C(和 C++)中的左值。

于 2019-03-19T20:54:30.037 回答