C宏含逗号参数字符串化问题:如何让#define正确识别完整参数
带逗号的模板类型在宏参数中的处理方案
你的问题根源是C++预处理器的参数解析规则:预处理器会把尖括号内的逗号当作宏的参数分隔符,所以LOG(TMap<int32, int32>)会被拆成两个参数传给LOG宏,最终导致#TYPE只截取到逗号前的TMap<int32。
不需要手动传入字符串,有两种简单的修复方式:
方法一:调用宏时用括号包裹参数
给模板类型加一层括号,让预处理器把整个括号内的内容视为单个参数:
LOG( (TMap<int32, int32>) );
若要去掉生成字符串里的外层括号,可以加一层中间宏来展开:
// 中间宏负责实际调用LOG_STUFF #define LOG_IMPL(TYPE) LOG_STUFF(TYPE, #TYPE) // 外层宏接收带括号的参数,传给中间宏时自动剔除外层括号 #define LOG(TYPE) LOG_IMPL( TYPE )
这样调用LOG( (TMap<int32, int32>) )时,#TYPE会被展开为"TMap<int32, int32>"。
方法二:改用可变参数宏
利用C++可变参数宏特性,让宏将整个模板类型作为单个参数块接收:
#define LOG(...) LOG_STUFF( __VA_ARGS__, #__VA_ARGS__ )
调用时直接正常书写即可:
LOG(TMap<int32, int32>);
预处理器会把__VA_ARGS__替换为完整的TMap<int32, int32>,#__VA_ARGS__自然生成"TMap<int32, int32>",完全符合预期。
内容的提问来源于stack exchange,提问作者M.kazem Akhgary
相关产品推荐
相关产品推荐

