Как объединить несколько строк кода в одну строку кода?

Демонстрационный код выглядит следующим образом:

#include <stdio.h>

#define DEMO(array) demo(array, sizeof(array) / sizeof(array[0]))

typedef struct Demo {
    const char *msg;
} Demo;

void demo(Demo list[], size_t list_size) {
    for (int i = 0; i < list_size; i++) {
        printf("%s\n", list[i].msg);
    }
}

int main() {
    Demo d[] = {
        {"Hello World"},
        {"Hello World"}
    };

    DEMO(d);
}

Я хочу слить код в основной функции, я представляю слияние так:

DEMO((Demo []){
  {"Hello World"},
  {"Hello World"}
});

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

Кажется, вы ищете составной литерал .

Some programmer dude 18.02.2023 10:31

OT: Изменить printf("%s\n", list[i].msg); на puts( list[ i ].msg );

Fe2O3 18.02.2023 10:34

@Fe2O3: Почему? Потому что это немного эффективнее? printf в порядке.

M Oehm 18.02.2023 10:37

Существует тонкая грань между «синтаксическим сахаром» и «запутыванием кода». То, о чем вы просите, похоже, последнее.

nielsen 18.02.2023 10:44

@MOehm Почему? Потому что читателю не нужно останавливаться, чтобы «исследовать», происходит ли что-то особенное в несуществующем спецификаторе формата (в этом показанном тривиальном примере).

Fe2O3 18.02.2023 10:44

Предлагаемое ОП решение не намного короче.

Weather Vane 18.02.2023 10:44

@ Fe2O3: Я знаю, что ты хочешь сказать, но мне кажется странным, что ты изо всех сил старался опубликовать комментарий по этому поводу. Неважно, наверное, так работает SO. Там вы даже получили за это голосование.

M Oehm 18.02.2023 11:00

@MOehm OP стремился немного упростить и «сжать» код. Просто пытаюсь помочь по-своему. Ваше здоровье! :-)

Fe2O3 18.02.2023 11:08

Чтобы оптимизировать, избавьтесь от одночленного struct и используйте массив указателей. Также было бы легче читать - не нужно искать, что такое Demo.

Weather Vane 18.02.2023 11:14

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям». (Мартин Фаулер)

Support Ukraine 18.02.2023 11:36

Можно написать эффективный код, занимающий несколько строк. Можно написать эффективный код, занимающий несколько строк. Можно написать эффективный код, который занимает несколько строк.....

Haris 18.02.2023 12:57
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
11
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

    DEMO(((Demo[]){{"Hello World"},{"Hello World"}}));
Ответ принят как подходящий

Вы действительно можете вызвать макрос с аргументом составного литерала, но вы должны быть более осторожны в определении макроса, заключая в скобки все экземпляры его аргумента в раскрытии, за исключением аргументов функции: sizeof(array[0]) вызывает синтаксическую ошибку для аргумента (Demo[]){{"Hello World"}, {"Hello World"}}

#include <stdio.h>

#define DEMO(array) demo(array, sizeof(array) / sizeof((array)[0]))

typedef struct Demo {
    const char *msg;
} Demo;

void demo(Demo list[], size_t list_size) {
    for (int i = 0; i < list_size; i++) {
        printf("%s\n", list[i].msg);
    }
}

int main() {
    DEMO((Demo[]){{"Hello World"}, {"Hello World"}});
}

С опубликованным определением вы по-прежнему можете вызывать макрос с составным литералом, но он должен быть заключен в скобки, чтобы обеспечить правильную оценку:

    DEMO( ( (Demo[]){ {"Hello World"}, {"Hello World"}} ) );

Другие вопросы по теме