Ich versuche, boolesche Werte, die Bits eines Signalbusses darstellen, in eine ganze Zahl zu konvertieren. Ich verwende das folgende Konstrukt:Wie definiere ich rekursive variadische Makros?
#define B_TO_UINT1(b00) (((uint32_t) b00 << 0))
#define B_TO_UINT2(b01, ...) (((uint32_t) b01 << 1) | B_TO_UINT1(__VA_ARGS__))
#define B_TO_UINT3(b02, ...) (((uint32_t) b02 << 2) | B_TO_UINT2(__VA_ARGS__))
#define B_TO_UINT4(b03, ...) (((uint32_t) b03 << 3) | B_TO_UINT3(__VA_ARGS__))
// ...
Wenn die Makrokaskade einen 1-, 2- und 3-Bit-Busse zu konvertieren, die ersten 2 sind in Ordnung, aber die 3-Bit-Umwandlung gibt einen Fehler:
cmd = B_TO_UINT1(1); // line_1
cmd = B_TO_UINT2(1, 0); // line_2
cmd = B_TO_UINT3(0, 1, 1); // line_3
Build-Fehler auf line_3
:
warning C4003: not enough actual parameters for macro 'B_TO_UINT1'
error C2059: syntax error : '<<'
So sieht der Teil __VA_ARGS__
nicht korrekt mit der Rekursion erweitert. Ist das wirklich der Fall? Wenn ja, gibt es einen Workaround?
Nehmen Sie 'bxx' Dinge in Klammern. –
@EugeneSh. - Vielen Dank. Im Allgemeinen ein guter Tipp, aber es löst dieses spezielle Problem nicht (ich bekomme andere, ')' verbundene Fehlermeldung). Jedenfalls kann ich im eigentlichen Code keine Klammern aus anderen Gründen verwenden. – ysap
"* .. Jedenfalls kann ich im eigentlichen Code keine Klammern aus anderen Gründen verwenden. *" In diesem Fall hat der Code ein Problem. Wie auch immer, welche Nachricht bekommst du? –