我看到像这样的宏定义:
#define ASSERT_VALID_PARAM(param, assertion) { static_cast<void>(param); if (!(assertion)) { throw InvalidParamError(#param, #assertion, __FILE__, __PRETTY_FUNCTION__, __LINE__); } }
我无法在此找出static_cast<void>(param)
的必要性。
知道为什么需要这个吗?
答案 0 :(得分:4)
此宏旨在验证某个 real 参数是否通过某个验证规则。宏的逻辑部分由两部分组成:
param
是一个真实参数,并带有有效名称。这是通过使用static_cast
完成的,如果使用非法名称,将生成编译时错误。assertion
的“真实性”。这是通过简单的否定if语句来完成的。如果param是有效名称,并且断言失败(assertion == false
),则抛出InvalidParamError
,使用传入的参数作为字符串(使用Stringizing operator #)进行初始化错误对象。
由于宏中param
参数的实际使用仅作为字符串,因此必须使用实际代码进行验证。由于不需要实际操作,因此使用static_cast,其丢弃结果并且可能被优化。如果没有这个检查,你可以传递任何会使断言中的信息变得毫无意义的值。
答案 1 :(得分:2)
这是写作的'c ++方式'
(void)param;
它使变量“使用”,从而禁用未使用变量的编译器警告
答案 2 :(得分:1)
static_cast<void>(param);
将评估param
并弃置结果。
如果您没有将演员表添加到void
:
4)如果new_type是void(可能是cv-qualified)类型,则为static_cast 在评估之后丢弃表达式的值。