Составные литералы кажутся немного менее известными функциями в 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».