Anonymous
Разница в расширении макросов между g++ и msvc
Сообщение
Anonymous » 10 янв 2025, 22:30
У меня есть служебный макрос для трансляции данного макроса всем аргументам:
Код: Выделить всё
#define NUM_ARGS_IMPL( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, \
//... many placeholders
_90,_91,_92,_93,_94,_95,_96,_97,_98,_99, \
N, ...) N
#define NUM_ARGS_EXPAND(tuple) NUM_ARGS_IMPL tuple
#define NUM_ARGS(...) NUM_ARGS_EXPAND((__VA_ARGS__, \
99,98,97,96,95,94,93,92,91,90, \
//... many numbers
9,8,7,6,5,4,3,2,1,0 \
))
#define INVOKE_MACRO(macro_name, ...) macro_name(__VA_ARGS__)
#define BROADCAST_1(macro_name, first ) INVOKE_MACRO(macro_name, first)
#define BROADCAST_2(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_1(macro_name, __VA_ARGS__)
#define BROADCAST_3(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_2(macro_name, __VA_ARGS__)
//... go through 1 to 99
#define BROADCAST_99(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_98(macro_name, __VA_ARGS__)
#define BROADCAST_EXPAND(macro_name, N, ...) BROADCAST_ ## N(macro_name, __VA_ARGS__)
#define BROADCAST_N(macro_name, N, ...) BROADCAST_EXPAND(macro_name, N, __VA_ARGS__)
/** uitl macro for broadcasting here */
#define BROADCAST(macro_with_one_param, ...) BROADCAST_N(macro_with_one_param, NUM_ARGS(__VA_ARGS__), __VA_ARGS__)
/** using broadcasting */
#define STR_OSTREAM(msg)
Подробнее здесь: [url]https://stackoverflow.com/questions/79340562/macro-expansion-differs-bettwen-g-and-msvc[/url]
1736537458
Anonymous
У меня есть служебный макрос для трансляции данного макроса всем аргументам: [code]#define NUM_ARGS_IMPL( \ _1, _2, _3, _4, _5, _6, _7, _8, _9, \ //... many placeholders _90,_91,_92,_93,_94,_95,_96,_97,_98,_99, \ N, ...) N #define NUM_ARGS_EXPAND(tuple) NUM_ARGS_IMPL tuple #define NUM_ARGS(...) NUM_ARGS_EXPAND((__VA_ARGS__, \ 99,98,97,96,95,94,93,92,91,90, \ //... many numbers 9,8,7,6,5,4,3,2,1,0 \ )) #define INVOKE_MACRO(macro_name, ...) macro_name(__VA_ARGS__) #define BROADCAST_1(macro_name, first ) INVOKE_MACRO(macro_name, first) #define BROADCAST_2(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_1(macro_name, __VA_ARGS__) #define BROADCAST_3(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_2(macro_name, __VA_ARGS__) //... go through 1 to 99 #define BROADCAST_99(macro_name, first, ...) INVOKE_MACRO(macro_name, first) BROADCAST_98(macro_name, __VA_ARGS__) #define BROADCAST_EXPAND(macro_name, N, ...) BROADCAST_ ## N(macro_name, __VA_ARGS__) #define BROADCAST_N(macro_name, N, ...) BROADCAST_EXPAND(macro_name, N, __VA_ARGS__) /** uitl macro for broadcasting here */ #define BROADCAST(macro_with_one_param, ...) BROADCAST_N(macro_with_one_param, NUM_ARGS(__VA_ARGS__), __VA_ARGS__) /** using broadcasting */ #define STR_OSTREAM(msg) Подробнее здесь: [url]https://stackoverflow.com/questions/79340562/macro-expansion-differs-bettwen-g-and-msvc[/url]