是否可以防止Rust中宏的重复相同参数?

时间:2016-08-13 09:51:35

标签: macros rust

在某些罕见的情况下,防止宏的重复参数可能会有用。一个示例是此elem(value, ...)宏来检查valueAB还是C

if (elem(value, A, B, C)) { .... }

有人可能会不小心多次传入相同的参数,例如:

if (elem(value, A, B, B)) { .... }

虽然这是有效的Rust,但它几乎肯定是一个意外,并且非常不可能成为开发人员的意图。这是一个简单的例子,实际的错误案例会更复杂。

在传递重复的参数时,有没有办法让编译器发出警告/错误?

  • 参数不一定都是常量,它们也可以与变量混合。

  • 这是我在某些代码中发现的实际错误。虽然有一个限制宏/编译器可以防止错误,但如果宏不允许,可能会提前检测到。这些错误应该在代码审查中找到,但是会发生错误。

  • 执行此操作的一种方法(不是万无一失)可能是将标识符转换为字符串,然后如果任何标识符完全匹配则为static-assert。这具有明显的缺点,即不同的标识符可以表示相同的常数值。也可以编写相同的标识符,以便不进行比较,例如:A[0] vs A[ 0 ]

  • 如果预处理器/编译器不能轻易做到这一点,那么后备解决方案可能是一些基本的静态检查工具。

  • 我设法do this with the C preprocessor

0 个答案:

没有答案