Zdefiniowałem kilka makr, które ułatwiają definiowanie tablicy struktur, ale nie mogę znaleźć sposobu na ich użycie bez generowania błędów. Oto makra (i kilka przykładowych struktur w celu wykazania, dlaczego mogą być wykorzystywane makra (rzeczywiste struktury Ja zaludniając są trochę bardziej skomplikowane)):Jak mam przecinek wewnątrz nawiasu wewnątrz argumentu makra, gdy nawiasy powodują błąd składni?
struct string_holder {
const char *string;
};
struct string_array_holder {
struct string_holder *holders;
};
#define DEFINE_STRING_ARRAY_HOLDER(name, values) \
static struct string_holder name##__array[] = values; \
static struct string_array_holder name = { name##__array }
#define WRAP_STRING(string) { string }
Współpracuje tylko podczas korzystania to zadeklarować tablicę z jednej pozycji:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, {
WRAP_STRING("my string")
});
Ale kiedy korzystać z wielu elementów:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, {
WRAP_STRING("hello"),
WRAP_STRING("world")
});
otrzymuję ten błąd:
error: too many arguments provided to function-like macro invocation
Interpretacja przecinka w nawiasach klamrowych jako separatora argumentów. Śledzę porady od this question i umieścić nawiasy wokół problematycznej argumentu:
DEFINE_STRING_ARRAY_HOLDER(my_string_array_holder, ({
WRAP_STRING("hello"),
WRAP_STRING("world")
}));
Teraz, gdy próbuję go skompilować, interpretuje ({ ... })
jako statement expression i narzeka:
warning: use of GNU statement expression extension
(a bunch of syntax errors resulting from its interpretation as a statement expression)
error: statement expression not allowed at file scope
Jak mogę albo:
- pomocą makra bez błędów (korzystnie) lub
- t przepisywania on jest makro [s] do pracy w tych okolicznościach?
Co z makrami variadic? Zobacz: http://stackoverflow.com/q/679979/929459 – Dmitri