我看到这样的宏定义:
#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)这里的需要。知道为什么需要这个吗?
该宏旨在验证某个实际参数是否通过某个验证规则。宏的逻辑部分由两部分组成:
param是一个真实的参数,具有有效的名称。这是通过使用 来完成的static_cast,如果使用非法名称,将生成编译时错误。assertion。这是通过一个简单的否定 if 语句来完成的。如果参数是有效名称,并且断言失败 ( assertion == false),InvalidParamError则会抛出一个错误,使用传入的参数作为字符串(使用字符串化运算符 #)来初始化错误对象。
由于宏中参数的实际用法param只是作为字符串,因此必须使用实际代码对其进行验证。由于不需要实际操作,因此使用 static_cast,它会丢弃结果并可能被优化掉。如果没有该检查,您可以传递任何值,这将使断言中的信息变得毫无意义。
| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |