Демонстрационный код выглядит следующим образом:
#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"}
});
Я помню, как однажды видел такой синтаксический сахар в проекте с открытым исходным кодом, но я не могу вспомнить, что это был за проект.
OT: Изменить printf("%s\n", list[i].msg); на puts( list[ i ].msg );
@Fe2O3: Почему? Потому что это немного эффективнее? printf в порядке.
Существует тонкая грань между «синтаксическим сахаром» и «запутыванием кода». То, о чем вы просите, похоже, последнее.
@MOehm Почему? Потому что читателю не нужно останавливаться, чтобы «исследовать», происходит ли что-то особенное в несуществующем спецификаторе формата (в этом показанном тривиальном примере).
Предлагаемое ОП решение не намного короче.
@ Fe2O3: Я знаю, что ты хочешь сказать, но мне кажется странным, что ты изо всех сил старался опубликовать комментарий по этому поводу. Неважно, наверное, так работает SO. Там вы даже получили за это голосование.
@MOehm OP стремился немного упростить и «сжать» код. Просто пытаюсь помочь по-своему. Ваше здоровье! :-)
Чтобы оптимизировать, избавьтесь от одночленного struct и используйте массив указателей. Также было бы легче читать - не нужно искать, что такое Demo.
«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям». (Мартин Фаулер)
Можно написать эффективный код, занимающий несколько строк. Можно написать эффективный код, занимающий несколько строк. Можно написать эффективный код, который занимает несколько строк.....
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"}} ) );
Кажется, вы ищете составной литерал .