Buscar..


Sintaxis

  • (tipo) {lista de inicializadores}

Observaciones

La norma C dice en C11-§6.5.2.5 / 3:

Una expresión de posfijo que consiste en un nombre de tipo entre paréntesis seguido de una lista de inicializadores de corchetes es un literal compuesto . Proporciona un objeto sin nombre cuyo valor viene dado por la lista de inicializadores. 99)

y la nota de pie de página 99 dice:

Tenga en cuenta que esto difiere de una expresión de reparto. Por ejemplo, una conversión de caracteres especifica una conversión a tipos escalares o solo anulados , y el resultado de una expresión de conversión no es un valor de l.

Tenga en cuenta que:

Los literales de cadena, y los literales compuestos con tipos const-calificados, no necesitan designar objetos distintos. 101)

101) Esto permite que las implementaciones compartan almacenamiento para literales de cadena y literales compuestos constantes con representaciones iguales o superpuestas.

El ejemplo se da en el estándar:
C11-§6.5.2.5 / 13:

Al igual que los literales de cadena, los literales compuestos con calificación constante se pueden colocar en la memoria de solo lectura e incluso se pueden compartir. Por ejemplo,

(const char []){"abc"} == "abc"

podría dar 1 si el almacenamiento de los literales es compartido.

Definición / Inicialización de Literales Compuestos

Un literal compuesto es un objeto sin nombre que se crea en el ámbito donde se define. El concepto fue introducido por primera vez en el estándar C99. Un ejemplo para literal compuesto es

Ejemplos de la norma C, C11-§6.5.2.5 / 9:

int *p = (int [2]){ 2, 4 };

p se inicializa en la dirección del primer elemento de una matriz sin nombre de dos ints.

El literal compuesto es un lvalor. La duración de almacenamiento del objeto sin nombre es estática (si el literal aparece en el ámbito del archivo) o automática (si el literal aparece en el ámbito del bloque), y en este último caso, la vida útil del objeto finaliza cuando el control abandona el bloque que lo contiene.

void f(void)
{
    int *p;
    /*...*/
    p = (int [2]){ *p };
    /*...*/
}

p se le asigna la dirección del primer elemento de una matriz de dos ints, el primero tiene el valor apuntado previamente por p y el segundo, cero. [...]

Aquí p permanece vigente hasta el final del bloque.

Compuesto literal con designadores.

(también de C11)

  struct point {
    unsigned x;
    unsigned y;
  };

  extern void drawline(struct point, struct point);

 // used somewhere like this
 drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

Una línea de drawline función ficticia recibe dos argumentos de tipo struct point . El primero tiene valores de coordenadas x == 1 y y == 1 , mientras que el segundo tiene x == 3 y y == 4

Literal compuesto sin especificar la longitud de la matriz

int *p = (int []){ 1, 2, 3};  

En este caso, el tamaño de la matriz no está especificado, entonces estará determinado por la longitud del inicializador.

Literal compuesto que tiene una longitud de inicializador menor que el tamaño de matriz especificado

int *p = (int [10]){1, 2, 3}; 

El resto de los elementos del literal compuesto se inicializarán a 0 implícitamente.

Literal compuesto de solo lectura

Tenga en cuenta que un literal compuesto es un lvalor y, por lo tanto, sus elementos pueden ser modificables. Un literal compuesto de solo lectura se puede especificar usando el calificador const como (const int[]){1,2} .

Literal compuesto que contiene expresiones arbitrarias

Dentro de una función, un literal compuesto, como para cualquier inicialización desde C99, puede tener expresiones arbitrarias.

void foo()
{
    int *p;
    int i = 2; j = 5;
    /*...*/
    p = (int [2]){ i+j, i*j };
    /*...*/
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow