我在一些源代码中注意到这一行:
if(pthread_create((pthread_t[]){}, 0, start_thread, pthread_args)) {
...
它工作正常,但如何理解第一个参数?
似乎,大括号转换为pthread_t[]
类型。
P.S。我用谷歌搜索,但没有找到答案,只有一些猜测(某种形式的初始化,或c的遗留特征?)
答案 0 :(得分:19)
这是word boundary symbol,自compound literal以来违反了约束:
gcc -std=c99 -Wall -Wextra -Wpedantic
使用compound_literal_pthread.c:6:36: warning: ISO C forbids empty initializer braces [-Wpedantic]
pthread_t *ptr = (pthread_t []){};
会产生警告:
pthread_t
结果似乎是指向{ 0 }
的指针,尽管我没有在gcc手册中看到这种行为。请注意,在C ++中允许使用空括号作为初始化程序,它们等同于(pthread_t[]){ 0 }
。这种行为似乎是由C支持的,但是没有记录,由gcc支持。我怀疑这就是这里发生的事情,使上面的表达式等同于:
pthread_t
在我的系统上,typedef
是unsigned long
的{{1}},因此该表达式会创建一个仅包含pthread_t
元素的0
数组。该数组将衰减为函数调用中指向pthread_t
的指针。
答案 1 :(得分:1)
这是@ some-programmer-dude提到的compound literal。
在这种特定情况下,用于创建一个数组来存储thread_id并稍后将其释放,而无需创建额外的变量。这是必要的,因为pthread_create
不接受NULL作为thread_id
的参数。
答案 2 :(得分:0)
您正在使用pthread[]
创建数组。如果为参数定义长度,则可以在花括号中传递值。
答案 3 :(得分:0)
你正在处理的是一个数组初始化器,它恰好是空数组。你通常会发现它:
int my_array[] = (int[]){10, 20, 30};
它会初始化my_array
以包含三个元素。这里没有元素,因此语法笨拙。