宏中“static_cast<void>”有什么用?

m.d*_*han 1 c++ casting

我看到这样的宏定义:

#define ASSERT_VALID_PARAM(param, assertion) {  static_cast<void>(param); if (!(assertion)) { throw InvalidParamError(#param, #assertion, __FILE__, __PRETTY_FUNCTION__, __LINE__); } }
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚static_cast<void>(param)这里的需要。知道为什么需要这个吗?

Ami*_*mit 5

该宏旨在验证某个实际参数是否通过某个验证规则。宏的逻辑部分由两部分组成:

  1. 验证这param是一个真实的参数,具有有效的名称。这是通过使用 来完成的static_cast,如果使用非法名称,将生成编译时错误。
  2. 验证“真实性” assertion。这是通过一个简单的否定 if 语句来完成的。

如果参数是有效名称,并且断言失败 ( assertion == false),InvalidParamError则会抛出一个错误,使用传入的参数作为字符串(使用字符串化运算符 #)来初始化错误对象。

由于宏中参数的实际用法param只是作为字符串,因此必须使用实际代码对其进行验证。由于不需要实际操作,因此使用 static_cast,它会丢弃结果并可能被优化掉。如果没有该检查,您可以传递任何值,这将使断言中的信息变得毫无意义。