그래서 GCC에서 잘 작동하지만 Microsoft의 C++ 컴파일러에서는 작동하지 않는 매크로가 있습니다. 나는 누군가가 해결 방법을 알기를 바랄 것입니다, 또는 아마 그것이 왜 이런 식으로 행동하는지 설명 할 수 있습니다.MSVC++ 가변 매크로 확장
이 매크로는 정확히 "표준"이 아니지만 정말로 도움이 될 것입니다. GCC는 위의 확장 방법은 다음과
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
:
여기#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)
내가이 매크로를 사용할 수있는 방법입니다 : 여기
매크로의 기능 예입니다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;
}
왜이 사람인지 알 수 있습니까? Microsoft에서 GCC와 같이 확장 할 수있는 트릭이 있습니까? 여분의 두 쌍의 괄호를 던지면 어떨까요?
이와 같은 매크로는 "풀"코드를 대체하는 데 정말로 도움이되지만이 문제로 인해 내 VS 프로젝트로 옮길 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다!
감사합니다.
It'sa [버그] (http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement)와 내가 생각하는 돈't 그들은 곧 그것을 고칠 계획이다. –
Linked Duplicate : [MSVC++ (Microsoft Visual Studio)에서 "매크로 오버로딩"으로 인한 가변 매크로 관련 문제를 해결하는 방법?] (https://stackoverflow.com/q/48710758/514235) - @JesseGood Thx 곤충. – iammilind