Visual Studio中宏重载的一些奇怪问题。
#define ENUM_INTERNAL(A, ...) A, ENUM_INTERNAL(__VA_ARGS__)
#define ENUM_INTERNAL(A) A, COUNT
#define ENUM(name, ...) struct name { enum en {ENUM_INTERNAL(__VA_ARGS__)}; };
ENUM(xxxx, A1, A2, A3)
static const xxxx::en x = xxxx::A3;
// All right, macro expanded into struct xxxx { enum en {A1, A2, A3, COUNT}; };
struct xxxx2 { enum en { ENUM_INTERNAL(A1, A2, A3) }; };
static const xxxx2::en x2 = xxxx2::A3;
// Compile error: no such member. struct xxxx2 { enum en {A1, COUNT}; };
据我所知,实际上没有多少个参数的宏重载。但不知何故,当我们通过__VA_ARGS__
表达式传递参数时,它在第一种情况下起作用。为什么会这样?