什么是&#34; static_cast <void>&#34;在宏?

时间:2015-06-23 06:13:04

标签: c++ casting

我看到像这样的宏定义:

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

我无法在此找出static_cast<void>(param)的必要性。 知道为什么需要这个吗?

3 个答案:

答案 0 :(得分:4)

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

  1. 验证param是一个真实参数,并带有有效名称。这是通过使用static_cast完成的,如果使用非法名称,将生成编译时错误。
  2. 验证assertion的“真实性”。这是通过简单的否定if语句来完成的。
  3. 如果param是有效名称,并且断言失败(assertion == false),则抛出InvalidParamError,使用传入的参数作为字符串(使用Stringizing operator #)进行初始化错误对象。

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

答案 1 :(得分:2)

这是写作的'c ++方式'

(void)param;

它使变量“使用”,从而禁用未使用变量的编译器警告

答案 2 :(得分:1)

static_cast<void>(param);将评估param并弃置结果。

如果您没有将演员表添加到void

  1. 你可能会收到警告说你忽视了结果 表达
  2. 即使您传递了一些非法代码(例如语句而不是表达式)作为参数,编译器也会很乐意接受它。
  3. 来自cppreference

      

    4)如果new_type是void(可能是cv-qualified)类型,则为static_cast   在评估之后丢弃表达式的值。