4

我想让某些函数调用的编译失败,但其他的不行。我想要失败的函数调用是那些在值属于某种类型时不处理返回值的函数调用。在下面的示例中,不处理返回的函数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;
}
4

3 回答 3

3

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

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

于 2012-09-14T00:34:30.613 回答
0

我已经尝试了几种方法来制作一个可以满足您需求的课程,但我没有成功。您是否考虑过将“返回值”作为通过引用传递的参数?这是我见过的最常见的 API 迫使您注意返回值的方式。所以而不是

Error DoThing();

你有

void DoThing(Error& e);

任何调用 DoThing() 的东西都必须传入一个 Error 对象,否则它们会得到编译器错误。同样,不完全是您要求的,但也许足够好?

于 2012-09-14T11:57:49.477 回答
0

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

这可以让您根据您的要求使用返回类型,或者为要测试的函数使用不同的标记,例如注释以指示应检查哪些函数。

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

于 2012-09-14T00:27:38.867 回答