如何在SystemVerilog宏中包含逗号,避免被编译器识别为多参数
C宏传递含逗号参数的解决方法
当需要把包含逗号的内容(比如num,val,int)作为单个参数传入宏,避免被编译器拆分成多个独立参数时,最直接可靠的方法是用圆括号包裹该参数。
示例说明
假设我们有一个接受单个参数的宏:
#define LOG_ARG(arg) printf("传入的参数是:%s\n", #arg)
如果直接调用LOG_ARG(num,val,int),编译器会报错——因为宏只定义了1个参数,但实际传入了3个。
改成以下调用方式即可解决:
LOG_ARG((num,val,int))
此时预处理器会把(num,val,int)视为单个参数,编译后输出:传入的参数是:(num,val,int)。
去掉参数外层的括号
如果不需要保留参数外层的括号,可以通过额外的宏来展开处理:
#define UNWRAP_PARENS(x) x #define LOG_ARG(arg) UNWRAP_PARENS(arg) // 调用 LOG_ARG((num,val,int))
预处理器会先将arg替换为(num,val,int),再通过UNWRAP_PARENS去掉括号,最终得到num,val,int。
多参数宏的场景
如果宏本身接受多个参数,其中某一个参数需要包含逗号,同样可以用括号包裹该参数。比如:
#define SET_STRUCT(type, init_val) type obj = init_val; // 调用,将结构体初始化语句作为单个参数传入 SET_STRUCT(Point, ((100, 200)))
这里((100,200))作为init_val的参数,被预处理器识别为单个整体,避免逗号被拆分。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

