【问题标题】:gRPC auth_context.h using std::iterator produces deprecated warning with latest VC++ compilergRPC auth_context.h 使用 std::iterator 使用最新的 VC++ 编译器产生不推荐使用的警告
【发布时间】:2020-01-27 22:16:22
【问题描述】:

使用最新的 Visual Studio 2019 16.5 preview 2 编译器编译我的一个使用 gRPC 的项目会产生以下警告:

1>D:\...\grpcpp\impl\codegen\security\auth_context.h(38,19): warning C4996: 'std::iterator<std::input_iterator_tag,const grpc::AuthProperty,ptrdiff_t,const grpc::AuthProperty *,const grpc::AuthProperty &>': warning STL4015: The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. (The <iterator> header is NOT deprecated.) The C++ Standard has never required user-defined iterators to derive from std::iterator. To fix this warning, stop deriving from std::iterator and start providing publicly accessible typedefs named iterator_category, value_type, difference_type, pointer, and reference. Note that value_type is required to be non-const, even for constant iterators. You can define _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

在提交错误报告之前,我想我已经在这里检查 gRPC 开发人员是否已经意识到这一点?

【问题讨论】:

  • 在我看来,这似乎是一个错误,Google 通常知道新标准。

标签: c++ grpc


【解决方案1】:

gRPC 目前依赖于依赖于 C++11 的 Absel。您应该避免在应用程序中使用两种不同的 C++ 标准,以避免模板不兼容。这里有关于 Absel C++11 与 C++17 版本的更长讨论:https://github.com/abseil/abseil-cpp/issues/259

您可以在 https://github.com/abseil/abseil-cpp 上查看 Absel 页面以获取更多详细信息。

【讨论】:

    【解决方案2】:

    gRPC 不支持 C++17 的立场有点令人惊讶。我可能会错过它,但我在 grpc 主页面上没有看到任何提及不支持 C++11 以外的任何内容。我能找到的唯一支持矩阵是:https://grpc.io/docs/#official-support

    一般来说,protobuf 和 gRPC 的使用都会在 Visual Studio 中引起大量与此错误无关的警告。对于生成的 cc 文件,抑制警告 4267、4996 和 4244 很有帮助。

    对于这个 C++17 警告/错误,由于问题在标头中,您将在自己的非生成 cpp 文件中遇到问题。您不想在每个使用标头的文件上禁用此类警告/错误,因为这样您将掩盖您自己的问题。我目前通过创建grpcpp.suppress_errors.h

    #pragma once
    #pragma warning ( push )
    #pragma warning( disable : 4996)
    #include <grpcpp/grpcpp.h>
    #pragma warning ( pop )
    

    然后不包括&lt;grpcpp/grpcpp.h&gt;,而是包括grpcc.suppress_errors.h。这有点傻,但它会让你自己的代码免受压制。

    【讨论】:

      【解决方案3】:

      aggieNick02's answer 没有为我修复它。但我可以设法抑制 Visual Studio 中的错误,如下所示:

      我在预处理器定义中添加了_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS;

      不如aggieNick02's answer 最佳,但至少这让我继续前进。

      我从vcpkg 获得了 grpc,如果该信息对某人有帮助:

      1.37.0 3
      dc35791a568aacf855355bcfcdff978ec22e69d3

      2021-07-27

      abseil (2021-03-24), c-ares (1.17.1), grpc (1.37.0), openssl (1.1.1k), protobuf (3.15.8), protobuf (3.15.8), re2 (2020-10-01), 向上 (2020-12-19)、zlib (1.2.11)

      【讨论】:

      • 很奇怪。我还从 vcpkg 获得了 grpc(诚然有点过时,更新到最近的提交在我的待办事项列表中),所以我想知道有什么不同。如果您有一个小空项目来重现警告不会消失,我很乐意看看。
      【解决方案4】:

      gRPC 当前不支持 C++17。我们目前正在使用 C++11。您可能应该使用任何必要的标志来让您的编译器强制执行 C++11 语义。

      【讨论】:

      • 我正在努力向前迈进十年。:(如果我正确阅读了 MS 编译器发出的警告,这意味着可以编写底层代码以符合较新的标准并且仍然可以工作使用较旧的编译器。
      • 是的,它可能会。不过,我们现在不认为这是一个错误,因为我们还不支持 C++17。如果您希望修复此问题,请随时向我们发送 PR。
      • 对 Mark 来说,进行更改并不是一件容易的事,但最好不要有这样的警告——这可能会在未来的某个时候变成错误。
      • 如果/当我们开始支持 C++17 时,我相信我们会解决这个问题。在此期间,如果它没有引起任何实际问题,这不会是我们改变的首要任务。
      猜你喜欢
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2016-09-19
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多