gpt4 book ai didi

c++ - “warning: not all control paths return a value” 是什么意思? (C++)

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:16 24 4
gpt4 key购买 nike

我得到的确切警告是

warning C4715: "spv::Builder::makeFpConstant": not all control paths return a value

spv::Builder::makeFpConstant

Id Builder::makeFpConstant(Id type, double d, bool specConstant)
{
assert(isFloatType(type));

switch (getScalarTypeWidth(type)) {
case 16:
return makeFloat16Constant(d, specConstant);
case 32:
return makeFloatConstant(d, specConstant);
case 64:
return makeDoubleConstant(d, specConstant);
}

assert(false);
}

谁能帮帮我?

最佳答案

断言 不算作控制流逻辑的一部分。这只是一个“记录”契约(Contract)检查。在发布版本中它甚至不会发生!它只是一个调试工具。

因此,如果标量类型宽度不是 16、32 或 64,您将得到一个省略 return 语句的函数。这意味着您的程序具有未定义的行为。该警告告诉您您需要在所有 情况下返回某些内容,即使您认为其他情况不会在运行时发生。

在这种情况下,如果您通过 switch 而没有返回,我可能会抛出一个异常——然后可以像处理任何其他异常情况一样处理。如果您不想要异常,另一种方法是自己调用 std::terminate(这是断言最终将在调试版本中执行的操作)。

但是,终止是一个核选项,您不希望您的程序在生产中终止;您希望它通过您现有的异常处理 channel 发出正确的诊断消息,以便当您的客户报告错误时,他们可以说“显然 makeFpConstant 得到了它没有预料到的值”并且您知道该怎么做。如果您不想向客户泄露函数名称,那么您至少可以选择一些只有您的团队/企业知道的“ secret ”故障代码(并在内部记录!)。

不过,在调试构建中终止通常没问题,所以也保留 assert 吧!或者只依赖于您现在拥有的异常,如果您没有捕获它,无论如何都会导致终止。

我可能会这样写这个函数:

Id Builder::makeFpConstant(
const Id type,
const double d,
const bool specConstant
)
{
assert(isFloatType(type));

const auto width = getScalarTypeWidth(type);
switch (width) {
case 16: return makeFloat16Constant(d, specConstant);
case 32: return makeFloatConstant(d, specConstant);
case 64: return makeDoubleConstant(d, specConstant);
}

// Shouldn't get here!
throw std::logic_error(
"Unexpected scalar type width "
+ std::to_string(width)
+ " in Builder::makeFpConstant"
);
}

关于c++ - “warning: not all control paths return a value” 是什么意思? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49349006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com