卷曲括号作为函数的参数

时间:2017-05-31 11:52:31

标签: c

我在一些源代码中注意到这一行:

if(pthread_create((pthread_t[]){}, 0, start_thread, pthread_args)) {
...

它工作正常,但如何理解第一个参数? 似乎,大括号转换为pthread_t[]类型。

P.S。我用谷歌搜索,但没有找到答案,只有一些猜测(某种形式的初始化,或c的遗留特征?)

4 个答案:

答案 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

在我的系统上,typedefunsigned 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以包含三个元素。这里没有元素,因此语法笨拙。