mayor - funcion si en excel
Tirantes rizados como argumento de funciĆ³n. (4)
Con lo que estás tratando es con un inicializador de matriz, que resulta ser la matriz vacía. Por lo general, lo encontrarás como:
int my_array[] = (int[]){10, 20, 30};
E inicializaría my_array
para contener tres elementos. Aquí no hay elementos, de ahí la sintaxis torpe.
He notado en algún código fuente la línea:
if(pthread_create((pthread_t[]){}, 0, start_thread, pthread_args)) {
...
Funciona correctamente, pero ¿cómo entender el primer argumento? Parece que las llaves se convierten al tipo pthread_t[]
.
P: Busqué en Google, pero no encontré la respuesta, solo algunas conjeturas (¿alguna forma de inicialización o característica heredada de c?)
Es un literal compuesto como lo menciona @ some-programmer-dude.
En este caso específico, se utiliza para crear una matriz para almacenar el thread_id y descargarlo más tarde sin la necesidad de crear una variable adicional. Esto es necesario porque pthread_create
no acepta NULL como argumento para thread_id
.
Estás creando una matriz con pthread[]
. Puede pasar valores en las llaves si define una longitud para el argumento.
Este es un literal compuesto , con una violación de restricción ya que los paréntesis del inicializador no pueden estar vacíos :
(pthread_t[]){}
Usando gcc -std=c99 -Wall -Wextra -Wpedantic
esto produce la advertencia:
compound_literal_pthread.c:6:36: warning: ISO C forbids empty initializer braces [-Wpedantic]
pthread_t *ptr = (pthread_t []){};
El resultado parece ser un puntero a pthread_t
, aunque no veo este comportamiento documentado en el manual de gcc. Tenga en cuenta que se permiten llaves vacías como inicializadores en C ++, donde son equivalentes a { 0 }
. Este comportamiento parece ser compatible con C, pero no documentado, por gcc. Sospecho que es lo que está sucediendo aquí, haciendo que la expresión anterior sea equivalente a:
(pthread_t[]){ 0 }
En mi sistema, pthread_t
es un typedef
para unsigned long
, por lo que esta expresión creará una matriz de pthread_t
contiene solo un elemento 0
. Esta matriz se descompondría en un puntero a pthread_t
en la llamada de función.