Подтвердить что ты не робот

Кудрявые фигурные скобки как аргумент функции

Я заметил в некотором исходном коде строку:

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

Он работает правильно, но как понять первый аргумент? Кажется, что фигурные скобки преобразуются в тип pthread_t[].

P.s. Я googled, но не нашел ответа, только некоторые догадки (некоторая форма инициализации или устаревшая функция c?)

4b9b3361

Ответ 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, чтобы содержать три элемента. Здесь нет элементов, следовательно, неудобный синтаксис.