c++ - 如果返回值未用于特定类型,则编译失败

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

最佳答案

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

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

关于c++ - 如果返回值未用于特定类型,则编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416604/

相关文章:

c++ - 使用谷歌云获取 403 禁止错误

C++ 返回指针/引用

vb.net - 有谁知道查看 VB.NET 项目的所有编译器警告的方法吗?

c++ - 为什么 (void)sizeof(param) 不是 "using"参数?

c# - 我得到了此错误 '… inaccessible due to it'的保护级别'

Eclipse 禁用自动源生成文件夹的警告

c++ - 如何将 boost::date_time::date::day_of_week() 转换为字符串类型?

c++ - QSerialPort 的 readAll() 不包括最后发送的响应

ruby-on-rails - Gem::Installer::ExtensionBuildError:错误:无法构建 gem native 扩展。 - 在 Debian 7 上安装 Redmine

java - Android Studio Flamingo 出现“compileDebugJavaWithJavac”错误