Vì vậy, tôi đã có một macro hoạt động tốt trong GCC, nhưng không phải trong trình biên dịch C++ của Microsoft. Tôi hy vọng ai đó có thể biết một cách giải quyết, hoặc có lẽ có thể giải thích cho tôi tại sao nó cư xử theo cách này.Mở rộng macro MSVC++ variadic
Tôi chắc chắn macro này không chính xác là "chuẩn", nhưng nó thực sự sẽ giúp tôi.
Dưới đây là một ví dụ chức năng 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)
Dưới đây là làm thế nào tôi có thể sử dụng macro này:
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
Sau đây là cách GCC mở rộng trên:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1>();
parent->GetProperty<Property2>();
parent->GetProperty<Property3>();
parent->GetProperty<Property4>();
}
Base * parent;
}
Nhưng Microsoft vì lý do nào đó mở rộng tất cả __VA_ARGS__ của tôi thành một đối số:
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1, Property2, Property3, Property4>();
}
Base * parent;
}
Có ai biết tại sao điều này không? Có một số trick tôi có thể kéo để có được Microsoft để mở rộng này như GCC? Có thể quăng thêm vài cặp ngoặc đơn?
Các macro như thế này thực sự có thể giúp tôi thay thế một loạt mã "keo", nhưng vì vấn đề này, tôi không thể di chuyển nó vào dự án VS của mình. Mọi sự trợ giúp sẽ rất được trân trọng!
Cảm ơn.
It 's [lỗi] (http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement) và tôi don' t nghĩ họ có kế hoạch sửa chữa nó bất cứ lúc nào sớm. –
Liên kết trùng lặp: [Làm thế nào để khắc phục các vấn đề liên quan đến macro Vĩ mô với "quá tải macro" trong MSVC++ (Microsoft Visual studio)?] (Https://stackoverflow.com/q/48710758/514235) - @JesseGood Thx để chỉ ra lỗi. – iammilind