Составные литералы кажутся немного менее известными функциями в C. Они, по сути, позволяют нам создавать анонимные массивы, структуры и объединения в C, как и во многих других языках.

Вот несколько примеров того, где может быть полезно использовать составные литералы…

Передача анонимных структур в функции

Здесь ниже вы можете видеть, что нам не нужно было объявлять Numbers structure в основной функции, мы напрямую передали анонимную структуру в функцию increment, а функция приращения также возвращает анонимную структуру обратно в функцию display… в этом не было необходимости объявить любую переменную без необходимости. Синтаксис для создания анонимной структуры — (type) {initializer_list}… это похоже на приведение типов к списку инициализации.

#include <stdio.h>
typedef struct
{
  int n1;
  int n2;
} Numbers;
Numbers increment(Numbers n)
{
  return (Numbers) {.n1=(++n.n1), .n2=(++n.n2)};
}
void display(Numbers n)
{
  printf("\n(%d, %d)\n", n.n1, n.n2);
}
int main(void)
{
  display(increment((Numbers) {2, 3}));
  return 0;
}

Выход:

(3,4)

Анонимные массивы (строки)

Преобразование целых символов в строки

Другой вариант использования, который я использовал лично, — это когда вы хотите добавить символы к строкам, используя значение Unicode символа.

Вот демо:

#include <stdio.h>
#include <string.h>
int main()
{
  char prefix[16] = "ABC";
  printf("\n%s\n", strcat(prefix, "D"));
  printf("\n%s\n", strcat(prefix, (char []) {69, '\0'}));
  return 0;
}

Выход:

ABCD

ABCDE
// The compound literal
 (char []) {69, '\0'}
// is equivalent to the string literal
 "E"

Здесь мы видим, что в 1-м printf мы просто используем строковый литерал для добавления «D». Но что, если бы нам нужно было выполнить какое-то перечисление, где нам нужно было бы сослаться на символ по его целочисленному значению Unicode. Мы могли бы использовать составной литерал для создания анонимного массива символов с 1-м элементом в качестве значения Unicode (69 -> «E»), а затем заканчивать массив нулевым терминатором «\ 0».