如果某个类型的返回值未使用,则编译失败

时间:2012-09-14 00:24:02

标签: c++ compiler-errors compiler-warnings static-analysis clang-static-analyzer

我想让某些函数调用的编译失败,而不是其他函数调用。我想要失败的函数调用是那些在值为某种类型时不处理返回值的函数。在下面的示例中,不处理返回Error的函数是编译错误,但是没有处理返回任何其他内容的函数应该成功。

注意:我们的运行时环境(嵌入式)不允许我们使用以下结构:RTTI,例外。

这段代码只需要用Clang编译,我宁愿不用注释每个函数。

我们更喜欢在编译时而不是在运行时失败的解决方案。

enum class Error {
  INVAL,
  NOERR,
};

// do something that can fail.
Error DoThing();
// may return different return codes, we never care (we can't change prototype)
int DoIgnoredThing();

int main() {
  DoThing(); // compilation failure here, unused "Error" result
  DoIgnoredThing(); // compilation succeeds, OK to ignore unused "int" result
  return 0;
}

3 个答案:

答案 0 :(得分:3)

我不知道用直接C ++做这件事的方法,但是如果你使用g ++,你可以使用warn_unused_result attribute和-Werror = unused-result命令行标志。请参阅warn_unused结果的文档以了解如何指定它(不幸的是,您必须在每个函数上指定它;我不相信您可以为类型指定它)。然后编译器标志会将该警告变为错误。

如果您不使用g ++,您的编译器可能具有类似的功能。

答案 1 :(得分:0)

您可能会发现使用代码分析工具扫描源代码更容易。

这可能允许您按照您的要求使用返回类型,或者使用不同的标记来测试函数,如注释以指示应检查哪些函数。

您可以将分析工具作为编译过程的一部分运行,也可以作为构建服务器的一部分运行。

答案 2 :(得分:0)

我已经尝试了几种方法来制作一个能够做你想做的课,但我还没有成功。您是否考虑过将“返回值”作为参考传递的参数?这是我见过API最常见的方式,迫使你注意返回值。而不是

Error DoThing();

你有

void DoThing(Error& e);

任何调用DoThing()的东西都必须传入一个Error对象,否则会出现编译错误。再一次,不完全是你要求的,但也许还不错?