所以我有一個在GCC中很好地工作的宏,但不是在微軟的C++編譯器中。我希望有人知道解決方法,或者可以向我解釋爲什麼這樣做。MSVC++ variadic宏擴展
我確定這個宏並不完全是「標準」,但它確實會幫助我。
這裏是宏的功能例如:
#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)
這裏是我會如何使用這個宏:GCC是如何擴展上述
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
這裏是:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1>();
parent->GetProperty<Property2>();
parent->GetProperty<Property3>();
parent->GetProperty<Property4>();
}
Base * parent;
}
但是由於某種原因,Microsoft將所有__VA_ARGS__擴展爲一個參數:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1, Property2, Property3, Property4>();
}
Base * parent;
}
有人知道這是爲什麼嗎?是否有一些技巧可以讓微軟像GCC一樣擴展?也許折騰一對額外的括號?
像這樣的宏可以真正幫我取代一堆「膠水」代碼,但由於這個問題,我無法將它移到我的VS項目中。任何幫助將不勝感激!
謝謝。
It'sa [錯誤](http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement)和I不'噸認爲他們計劃在不久的將來修復它。 – 2012-02-07 21:45:02
鏈接重複:[如何解決可變宏與MSVC++(Microsoft Visual Studio)中的「宏重載」相關的問題?](https://stackoverflow.com/q/48710758/514235) - @JesseGood Thx用於指出錯誤。 – iammilind 2018-02-10 04:43:38