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

Is it possible to pass a non-enum value as an enum function parameter?

本文关键字:枚举 函数 参数传递 是否      更新时间:2023-10-16

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

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;
}

其中 State E 定义为:

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

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

换句话说,是否可以将枚举

范围之外的值作为参数内传递给函数,其中函数的签名表明参数是枚举类型?

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

没有方法太黑客了!

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

convertStateToString(static_cast<StateE>(10));

这将强制您的代码传入开关/机箱的"默认值"。

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

我没有看到问题:

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

输出:

ABNORMAL