Напомним, что функционально-подобные макросы выполняют прямую подстановку своих параметров. Это означает, что это:
test_init(&test, a);
Получает преобразованный препроцессором в:
&test = (test_t)calloc(1, sizeof(test_t));
(&test)->a = a;
(&test)->b = (&test)->a + 1;
Обратите внимание, что в первой строке вы пытаетесь присвоить что-то &test
. Результат оператора &
не приводит к lvalue. Это означает, что вы не можете назначить что-то для &test
, потому что это не представляет то, что вы можете назначить.
Чтобы это исправить, вам нужно объявить test
в main как указатель:
test_t *test;
int a = 5;
test_init(test, a);
Или, если вы ожидаете, что макросу будет передан экземпляр типа test_t
, вам не нужен вызов calloc
:
#define test_init(test, a) \
(test).a = a; \
(test).b = (test).a + 1; \