Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

175
Vistas
Una expresión de control de tipo puntero a VLA en una expresión _Generic

¿Por qué esta aserción estática no se activa en los principales compiladores?

 void test(int x){ _Static_assert(_Generic( (char(*)[x])0, char (*)[1]: 1, default: 0),""); }

https://gcc.godbolt.org/z/E67a79oPT

¿Se supone que los punteros a matrices de longitud variable son compatibles con los punteros a matrices de longitud fija?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

De hecho son compatibles.

Primero, la sección 6.7.6.2p6 del estándar C dice lo siguiente sobre la compatibilidad de los tipos de matrices:

Para que dos tipos de matrices sean compatibles, ambos deben tener tipos de elementos compatibles, y si ambos especificadores de tamaño están presentes y son expresiones constantes enteras, ambos especificadores de tamaño deben tener el mismo valor constante. Si los dos tipos de matrices se usan en un contexto que requiere que sean compatibles, es un comportamiento indefinido si los dos especificadores de tamaño se evalúan como valores diferentes.

A partir de esto, existe el requisito de que si ambos tamaños de matriz son expresiones constantes enteras (es decir, ninguno es un VLA), entonces deben ser iguales. Sin embargo, esto no se aplica si uno es un VLA, por lo que los hace compatibles.

Además, la sección 6.2.7p3 dice lo siguiente con respecto a los tipos compuestos:

Un tipo compuesto se puede construir a partir de dos tipos que son compatibles; es un tipo que es compatible con los dos tipos y cumple las siguientes condiciones:

  • Si ambos tipos son tipos de matriz, se aplican las siguientes reglas:
    • Si un tipo es una matriz de tamaño constante conocido, el tipo compuesto es una matriz de ese tamaño.
    • De lo contrario, si un tipo es una matriz de longitud variable cuyo tamaño se especifica mediante una expresión que no se evalúa, el comportamiento no está definido.
    • De lo contrario, si un tipo es una matriz de longitud variable cuyo tamaño se especifica, el tipo compuesto es una matriz de longitud variable de ese tamaño.
    • De lo contrario, si un tipo es una matriz de longitud variable de tamaño no especificado, el tipo compuesto es una matriz de longitud variable de tamaño no especificado.
    • De lo contrario, ambos tipos son matrices de tamaño desconocido y el tipo compuesto es una matriz de tamaño desconocido. El tipo de elemento del tipo compuesto es el tipo compuesto de los dos tipos de elementos.

Esto significa que al comparar los tipos char(*)[x] y char(*)[1] , su tipo compuesto es char(*)[1] . Lo que esto también significa es que char(*)[x] es compatible con cualquier puntero a una matriz de tamaño fijo de char . Entonces, si su función se veía así:

 void test(int x){ _Static_assert(_Generic( (char(*)[x])0, char (*)[2]: 2, char (*)[1]: 1, default: 0),""); }

Obtendrá un error de compilación porque la expresión de control es compatible con varias opciones, aunque las opciones no son compatibles entre sí.

over 4 years ago · Santiago Trujillo Denunciar

0

Son compatibles. C 2018 6.7.6.2 6 dice: "Para que dos tipos de matrices sean compatibles, ambos deben tener tipos de elementos compatibles, y si ambos especificadores de tamaño están presentes y son expresiones constantes enteras, ambos especificadores de tamaño deben tener el mismo valor constante..." Dado que no es cierto que ambos especificadores de tamaño sean expresiones constantes enteras, no se aplica el requisito de tener el mismo valor.

La compatibilidad del puntero se hereda de los tipos apuntados.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda