# MacroArgument
создает строковый литерал из аргумента макроса.
Ваш код:
struct test
{
float tst;
}test;
// Macro that creates callback functions
#define test_float_(varname) \
void test_float_##varname(void) {\
test.#varname = 0;\
}
test_float_(tst)
предварительно обрабатывает (https://gcc.godbolt.org/z/ZkaKaA):
struct test
{
float tst;
}test;
void test_float_tst(void) { test."tst" = 0;}
Часть test."tst" = 0;
, очевидно, является синтаксической ошибкой. Потеря #
до varname
, и он будет работать.
(Примечание: флаг -E
, данный компилятору POSIX C, приводит к тому, что он просто запускает препроцессор в текстовом режиме. найти его полезным при отладке C макросов.)