Кудрявые фигурные скобки как аргумент функции
Я заметил в некотором исходном коде строку:
if(pthread_create((pthread_t[]){}, 0, start_thread, pthread_args)) {
...
Он работает правильно, но как понять первый аргумент?
Кажется, что фигурные скобки преобразуются в тип pthread_t[]
.
P.s. Я googled, но не нашел ответа, только некоторые догадки (некоторая форма инициализации или устаревшая функция c?)
Ответы
Ответ 1
Это составной литерал, с нарушением ограничения, поскольку привязки инициализатора не может быть пустым:
(pthread_t[]){}
Используя 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
, хотя я не вижу этого поведения, описанного в руководстве gcc. Обратите внимание, что пустые фигурные скобки разрешены как инициализаторы в С++, где они эквивалентны { 0 }
. Такое поведение, по-видимому, поддерживается для C, но недокументировано gcc. Я подозреваю, что это то, что здесь происходит, делая вышеупомянутое выражение эквивалентным:
(pthread_t[]){ 0 }
В моей системе pthread_t
является typedef
для unsigned long
, поэтому это выражение создаст массив pthread_t
, содержащий только элемент 0
. Этот массив распадается на указатель на pthread_t
в вызове функции.
Ответ 2
Это составной литерал, как упоминается @some-programmer-dude.
В этом конкретном случае используется создание массива для хранения thread_id и его последующего освобождения без необходимости создания дополнительной переменной. Это необходимо, потому что pthread_create
не принимает NULL в качестве аргумента для thread_id
.
Ответ 3
Вы создаете массив с pthread[]
. Вы можете передавать значения в фигурных скобках, если вы определяете длину аргумента.
Ответ 4
Что вы имеете в виду, это инициализатор массива, который является пустым массивом. Вы обычно находите это как:
int my_array[] = (int[]){10, 20, 30};
И он инициализирует my_array
, чтобы содержать три элемента. Здесь нет элементов, следовательно, неудобный синтаксис.