如何定义带参数的预编译文本替换宏以实现dut_error统一封装?
问题原因
首先明确你之前三种尝试失败的根本原因:
check that ... else语法有明确限制,else子句后只能直接跟dut_error/dut_errorf/error等内置错误触发语句,不支持自定义方法调用,所以第一种方法写法直接报错。- Specman E的预处理器
#define仅支持无参数的常量替换,不支持带参数的宏定义,所以第三种写法属于语法错误。 - 你之前写的自定义宏类型是
<my_dut_error'exp>(表达式宏),而dut_error是语句类型,且参数类型定义为<arg1'name>仅匹配标识符,不匹配字符串常量、表达式等输入,导致宏没有被正确触发替换,编译器依然识别为自定义方法调用,所以报错。
正确实现方案
方案1:封装完整的自定义check宏(最推荐)
直接匹配check ... else my_dut_error(...)的完整语句结构,预编译阶段直接展开为原生合法的check语句,完全符合语法要求,同时满足你统一报错格式的需求:
// 自定义check宏定义 define <my_check'statement> "check <cond'exp> else my_dut_error(<arg1'exp>, <arg2'exp>)" as { check <cond'exp> else dut_error("first argument is ", <arg1'exp>, " and second argument is ", <arg2'exp>); }; // 调用示例,和你原本的写法完全一致 check FALSE else my_dut_error("check1", "check2");
预编译展开后会自动生成完全合法的原生代码:
check FALSE else dut_error("first argument is ", "check1", " and second argument is ", "check2");
方案2:独立的my_dut_error语句宏
如果你需要在非check场景下也调用统一格式的dut_error,可以单独定义语句宏:
// 独立错误触发宏定义 define <my_dut_error'statement> "my_dut_error(<arg1'exp>, <arg2'exp>)" as { dut_error("first argument is ", <arg1'exp>, " and second argument is ", <arg2'exp>); }; // 单独调用示例 my_dut_error("test1", "test2");
注意这种独立宏依然不能直接放在check ... else后面,因为E编译器在语法解析阶段会先检查else后的内容是否为内置错误语句,此时宏还未触发替换,会提前报语法错误,所以更推荐用方案1的完整check封装。
内容的提问来源于stack exchange,提问作者Tomerikoo
相关产品推荐
相关产品推荐

