在某些罕见的情况下,防止宏的重复参数可能会有用。一个示例是此elem(value, ...)
宏来检查value
是A
,B
还是C
:
if (elem(value, A, B, C)) { .... }
有人可能会不小心多次传入相同的参数,例如:
if (elem(value, A, B, B)) { .... }
虽然这是有效的Rust,但它几乎肯定是一个意外,并且非常不可能成为开发人员的意图。这是一个简单的例子,实际的错误案例会更复杂。
在传递重复的参数时,有没有办法让编译器发出警告/错误?
参数不一定都是常量,它们也可以与变量混合。
这是我在某些代码中发现的实际错误。虽然有一个限制宏/编译器可以防止错误,但如果宏不允许,可能会提前检测到。这些错误应该在代码审查中找到,但是会发生错误。
执行此操作的一种方法(不是万无一失)可能是将标识符转换为字符串,然后如果任何标识符完全匹配则为static-assert。这具有明显的缺点,即不同的标识符可以表示相同的常数值。也可以编写相同的标识符,以便不进行比较,例如:A[0]
vs A[ 0 ]
。
如果预处理器/编译器不能轻易做到这一点,那么后备解决方案可能是一些基本的静态检查工具。