Así que tengo una macro que funciona muy bien en GCC, pero no en el compilador C++ de Microsoft. Espero que alguien sepa de una solución, o quizás pueda explicarme por qué se comporta de esta manera.MSVC++ variadic macro expansion
Estoy seguro de que este macro no es exactamente "estándar", pero realmente me ayudaría.
Aquí está un ejemplo funcional de la macro:
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)
#define FULLY_EXPANDED(count, ...) \
MAC## count (__VA_ARGS__)
#define SEMI_EXPANDED(count, ...) FULLY_EXPANDED(count, __VA_ARGS__)
#define EXPAND_THESE(...) SEMI_EXPANDED(VA_NARGS(__VA_ARGS__), __VA_ARGS__)
#define ACTUAL_MACRO(x) parent->GetProperty<x>();
#define MAC1(a) ACTUAL_MACRO(a)
#define MAC2(a,b) MAC1(a) ACTUAL_MACRO(b)
#define MAC3(a,b,c) MAC2(a,b) ACTUAL_MACRO(c)
#define MAC4(a,b,c,d) MAC3(a,b,c) ACTUAL_MACRO(d)
#define MAC5(a,b,c,d,e) MAC4(a,b,c,d) ACTUAL_MACRO(e)
Aquí es cómo podría utilizar esta macro:
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
está aquí cómo GCC se expande lo anterior:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1>();
parent->GetProperty<Property2>();
parent->GetProperty<Property3>();
parent->GetProperty<Property4>();
}
Base * parent;
}
Pero Microsoft por alguna razón expande todos mis __VA_ARGS__ como un argumento:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1, Property2, Property3, Property4>();
}
Base * parent;
}
¿Alguien sabe por qué es esto? ¿Hay algún truco que pueda utilizar para que Microsoft expanda esto como GCC? ¿Tal vez tirar un par de paréntesis adicionales?
Este tipo de macros me podría ayudar a reemplazar un montón de código "pegamento", pero debido a este problema, no puedo moverlo a mi proyecto VS. ¡Cualquier ayuda sería muy apreciada!
Gracias.
'SA [bug] (http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement) y I don' t piensan planean arreglarlo pronto. –
Duplicado vinculado: [¿Cómo corregir problemas relacionados con la macro variadic con "macro sobrecarga" en MSVC++ (estudio de Microsoft Visual)?] (Https://stackoverflow.com/q/48710758/514235) - @JesseGood Thx para señalar el error. – iammilind