Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

540
Visualizações
¿Qué es ${type}Var en Kotlin/Native?

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 a CPointer<S> , int8_t* se asigna a CPointer<int_8tVar>

Está bien, está claro

char** está asignado a CPointer<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 ?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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.

over 4 years ago · Santiago Trujillo Relatório

0

¿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 a CPointer<CPointerVar<ByteVar>> pero no a CPointer<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++).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda