Esta documentación es muy poco clara para mí cuando intenta decir qué es ${type}Var .
... para las enumeraciones de Kotlin se llama
${type}Var
¡¿Qué?! ¿Qué son las enumeraciones de Kotlin? ¿Enumeraciones regulares de Kotlin?
enum class MyEnum { FIRST, SECOND }No creo que esté implícito.
Bien, veamos los ejemplos en esta documentación:
struct S*se asigna aCPointer<S>,int8_t*se asigna aCPointer<int_8tVar>
Está bien, está claro
char**está asignado aCPointer<CPointerVar<ByteVar>>
¿Por qué char** está asignado a CPointer<CPointerVar<ByteVar>> pero no a CPointer<CPointer<Byte>> ?
Entonces, finalmente, la pregunta es: ¿qué es IntVar , LongVar , CPointerVar<T> y otras cosas como ${type}Var ?
Deberías leer todo el párrafo de nuevo con atención.
Todos los tipos de C admitidos tienen representaciones correspondientes en Kotlin:
- Las enumeraciones se pueden asignar a la enumeración de Kotlin
También en C hay lvalues y rvalues (En C++ el equivalente es Type & para lvalues y Type para rvalues). La distinción principal es que los valores l se pueden establecer en algún valor, mientras que los valores r no se pueden cambiar después de la inicialización. Entonces, para cada tipo en C, necesita su propio tipo Kotlin para lvalue y para rvalue.
en el tema
Todos los tipos de C admitidos tienen representaciones correspondientes en Kotlin:
sólo se consideran los valores de r. Pero para lvalues, lo único que necesita agregar es Var hasta el final del tipo. La única excepción es
Para estructuras (y typedefs a estructuras) esta representación es la principal y tiene el mismo nombre que la estructura misma
Ahora volvamos a las enumeraciones. Las enumeraciones regulares de Kotlin se asignan a las enumeraciones regulares de C. Entonces, en realidad, FIRST y SECOND tienen el tipo MyEnum en ambos idiomas. Pero, ¿qué sucede si desea crear una variable que contenga MyEnum por ejemplo?
// This is C Code MyEnum a = FIRST; a tiene el tipo MyEnum en C, pero es lvalue (en C++ es MyEnum & ), por lo que en Kotlin a tendrá el tipo MyEnumVar porque eso es exactamente lo que se dice en la documentación: ${type}Var , donde ${type} = MyEnum .
A las siguientes preguntas:
El argumento de tipo T de CPointer debe ser uno de los tipos "lvalue"
Entonces, para struct S* debería ser CPointer<SVar> , pero recuerda que struct s son excepciones y no debemos agregar Var , así que eso es solo CPointer<S> .
int8_t* es CPointer<int_8tVar> - aquí no hay excepción.char* es CPointer<ByteVar> ; de nuevo, sin excepción (solo tipos lvalue, excepto estructuras).char** es CPointer<CPointerVar<ByteVar>> ya que necesitamos lvalue para CPointer<ByteVar> y eso es exactamente CPointerVar<ByteVar> . Finalmente: IntVar , LongVar , CPointerVar<T> y otras cosas son lvalues de tipos int , long , CPointer . Eso puede ser necesario si desea cambiar el objeto en la función. Algo así como Ref<${type}> en Java.
¿Qué es
IntVar,LongVar,CPointerVar<T>y otras cosas como${type}Var?
Eso está al comienzo de la oración cuyo final citaste:
el tipo de Kotlin que representa el valor l de este tipo, es decir, el valor ubicado en la memoria en lugar de un valor autónomo inmutable simple
"ubicado en la memoria" significa que puede tomar su dirección (usando el operador & en C o .ptr en Kotlin).
¡¿Qué?! ¿Qué son las enumeraciones de Kotlin? ¿Enumeraciones regulares de Kotlin?
Sí, entonces cuando Kotlin/Native ve MyEnum , también genera MyEnumVar .
¿Por qué
char**está asignado aCPointer<CPointerVar<ByteVar>>pero no aCPointer<CPointer<Byte>>?
CPointer<CPointer<Byte>> es ilegal: el parámetro de tipo de CPointer debe extender CPointed y Byte y CPointer<T> no. Y la razón por la que necesitan extender CPointed es porque quitar la referencia a un puntero da un valor l: ¡algo que tiene una dirección!
Consulte https://docs.microsoft.com/en-us/cpp/c-language/l-value-and-r-value-expressions o https://eli.thegreenplace.net/2011/12/15/understanding -lvalues-and-rvalues-in-c-and-c/ para obtener más información sobre lvalues en C (y C++).