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.