是否可以将非枚举值作为枚举函数参数传递?

时间:2015-03-13 14:19:29

标签: c++ unit-testing enums reinterpret-cast

我有一个看起来像这样的函数:

std::string SomeClass::convertStateToString(StateE state) const
{
  std::string stateAsString;
  switch (state)
  {
    case UNKNOWN:
      stateAsString = "UNKNOWN";
      break;
    case OFFLINE:
      stateAsString = "OFFLINE";
      break;
    case ENABLED:
      stateAsString = "ENABLED";
      break;
    case DISABLED:
      stateAsString = "DISABLED";
      break;
    default:
      stateAsString = "ABNORMAL";
      break;
  }
  return stateAsString;
}

其中StateE定义为:

typedef enum
{
  UNKNOWN      = 0,
  OFFLINE      = 1,
  ENABLED      = 2,
  DISABLED     = 3
} StateE;

出于单元测试的目的,我想将一些不良数据提供给convertStateToString,并验证我得到"ABNORMAL"。这可能吗?

换句话说,是否可以将枚举范围之外的值作为in-parameter传递给函数的签名表示参数属于枚举类型的函数?

在尝试了指针和reinterpret_cast之后,我几乎准备声称函数convertStateToString在任何情况下都不能返回"ABNORMAL"

没有方法太过于苛刻!

3 个答案:

答案 0 :(得分:2)

您可以在单元测试中写下这个:

convertStateToString(static_cast<StateE>(10));

这将强制您的代码传入&#34;默认&#34;你的开关/箱子。

答案 1 :(得分:1)

无论C ++尝试执行正确的类型检查的方式有多少, 它仍然可以只取内存位置的地址并更改其内容。 例如:声明一个StateE类型的变量,获取其地址,在其中写入一个超出范围的值,然后将其传递给该函数。 可能变量应该是易变的。

答案 2 :(得分:1)

我没有看到问题:

std::string convertStateToString(StateE state);

int main() {
    std::cout << convertStateToString(StateE(30)) << "\n";
}

输出:

ABNORMAL