Описание тега compound-literals

Используйте этот тег, чтобы задать вопросы о семантике или использовании составного литерала, который был введен в C99.
1 ответ

Есть ли способ для составного литерала иметь переменную длину в C99?

Я знаю, что массивы с длинами, определенными во время выполнения, возможны, если объявить массив как обычно: char buf[len]; и я знаю, что могу объявить массив как составной литерал и назначить его указателю на полпути: char *buf; .... buf = (char[5]…
27 янв '13 в 18:19
1 ответ

Почему я не могу передать постоянные массивы в качестве аргументов?

В C, почему я не могу сделать это: arrayfn({1.0, 2.0, 3.0}); если arrayfn некоторая функция, которая принимает один параметр типа double[] или же double*, какой бы ни. Попытка этого дает мне синтаксическую ошибку. Есть ли способ, которым я мог бы до…
3 ответа

Структура против строковых литералов? Только чтение против чтения и записи?

Разрешает ли стандарт C99 писать в составные литералы (структуры)? Кажется, он не обеспечивает запись в буквальные строки. Я спрашиваю об этом, потому что это написано в C Программирование: Современный подход, 2-е издание на стр. 406. Q. Разрешение …
23 авг '18 в 22:41
1 ответ

Составные литералы для скалярных типов

Поскольку c99 составные литералы могут использоваться, например, для инициализации указателей: int *p = (int []) {1, 2, 3, 4}; в то время как это обычно используется для structs также может использоваться для инициализации анонимных массивов (см. пр…
24 июн '15 в 08:46
3 ответа

Зачем использовать такие функции, как CGRectMake?

Мне любопытно, почему такие функции, как CGRectMake и CGPointMake существуют и широко используются. когда вместо этого вы можете сделать: (CGRect){{x, y}, {width, height}} конечно, это более эффективно (хотя я догадываюсь не очень), поскольку нет вы…
1 ответ

Инициализация указателя на составные литералы в C

Вот один не очень распространенный способ инициализации указателя: int *p = (int[10]){[1]=1}; Здесь указатель указывает на составные литералы. #include <stdio.h> int main(void) { int *p = (int[10]){[1]=1}; printf("%d\n", p[1]); } Выход: 1 Эта …
04 окт '17 в 05:23
2 ответа

Как составные литералы работают в этом коде?

У меня есть следующий код, в котором я написал две функции. Оба предназначены для получения одинакового результата. Но функция g() У которого цикл имеет другой результат, чем я ожидал, как показано ниже. #include <stdio.h> struct S { int i; };…
13 дек '12 в 17:27
1 ответ

C - Создание анонимного экземпляра структуры

В этом коде структура определяется следующим образом: typedef struct { int line; int column; } Pos; И позже использовал этот способ: Pos get_pos ( int delta ) { ... return ( Pos ){ f->line, f->column + delta }; } Линия, return ( Pos ){ f->l…
08 фев '19 в 04:18
3 ответа

Срок хранения составных литералов

Я почему-то не могу понять, как длительность хранения составных литералов, определенных в блоках, автоматическая, и причина заключается в следующем: давайте предположим, что составной литерал определен в функции или блоке, который вызывается повторн…
21 фев '15 в 19:51
1 ответ

Почему составные литералы не являются частью C++ до сих пор?

Я знаю, что C & C++ - это разные языки, стандартизированные разными комитетами. Я знаю, что эффективность C, как и прежде, была главной целью при разработке C++. Итак, я думаю, что если какая-либо функция не повлечет за собой никаких накладных расхо…
14 фев '16 в 10:29
1 ответ

Создается ли новый объект каждый раз, когда составной литерал присваивается указателю в цикле?

Согласно стандарту С99 6.5.2.5 .9 код: int *p = (int []){2, 4}; инициализирует p, чтобы указывать на первый элемент массива из двух целых, первый из которых имеет значение два, а второй - четыре. Выражения в этом составном литерале должны быть посто…
11 июн '13 в 05:43
4 ответа

# определить константу

Допустим, у меня есть структура: struct location { int x; int y; }; Затем я хочу определить недопустимое местоположение для использования позже в программе: #define INVALID_LOCATION (struct location){INT_MAX,INT_MAX} Однако, когда я использую это в …
26 июн '13 в 10:44
1 ответ

Любой способ инициализировать динамически распределенную структуру?

C11 дает нам аккуратный синтаксис инициализации структуры: struct some_struct {int some; char value;}; struct some_struct s = {.some = 5, .value = 'a'}; printf("some = %d, value = %c\n", s.some, s.value); http://ideone.com/zZxTc4 Тем не менее, это н…
03 май '17 в 14:31
3 ответа

Составные литералы и функционально-подобные макросы: ошибка в gcc или стандарт Си?

В C99 у нас есть составные литералы, и они могут быть переданы в функции, как в: f((int[2]){ 1, 2 }); Однако если f это не функция, а скорее подобный функции макрос, gcc barfs для этого из-за того, что препроцессор анализирует его не как один аргуме…
05 апр '11 в 20:33
1 ответ

Размер составного литерального массива

Я пытаюсь статически выделить некоторые структуры, каждая из которых содержит два члена: указатель на массив структур и размер этого массива. Вот рабочая версия кода: #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0])) struct conf_element { char *k…
4 ответа

Массив как составной литерал

В C99 мы можем использовать составные литералы как безымянный массив. Но это литеральные константы, как, например, 100, 'c', 123.4f, так далее. Я заметил, что я могу сделать: ((int []) {1,2,3})[0] = 100; и у меня нет ошибки компиляции, и я предполаг…
14 июл '14 в 15:21
1 ответ

Передать массив структур как составной литерал в функцию

У меня есть объявление массива, где я инициализировал все элементы массива с некоторым начальным значением. Теперь я хочу создать элементы массива "на лету"/ по требованию без необходимости статически распределять все элементы. test_t test_array[10]…
31 мар '15 в 07:06
1 ответ

Инициализировать указатель на структуру с составным литералом

Я новичок в C и пытаюсь понять синтаксис составных литералов. Мой вопрос похож на инициализацию указателя на составные литералы в C, но я не думаю, что это отвечает. Если есть структура и тип, определенный как указатель на структуру, вот так: typede…
14 июн '18 в 14:37
1 ответ

Инициализация вложенных структур / массивов

У меня есть структура, которая содержит массивы другой структуры, это выглядит примерно так: typedef struct bla Bla; typedef struct point Point; struct point { int x, y; }; struct bla { int another_var; Point *foo; }; Теперь я хочу инициализировать …
12 дек '08 в 13:16
2 ответа

Определение загадочной структуры в C

Я наткнулся на следующий код определения лабиринта: typedef struct mazeNode { int hasCheese; int tag; struct mazeNode *left; struct mazeNode *right; } maze_t; maze_t maze = { .tag = 1, .left = &(maze_t) { .left = &(maze_t) { .left = &(ma…