boost :: system ::(...)_category已定义但未使用
-
06-07-2019 - |
题
我目前正在收到类似于我在问题标题中提供的警告的编译器警告。警告如......
警告:'boost :: system :: generic_category'已定义但未使用
警告:'boost :: system :: posix_category'已定义但未使用
警告:'boost :: system :: errno_ecat'已定义但未使用
警告:'boost :: system :: native_ecat'已定义但未使用
据我所知,该计划没有受到任何影响。但是,我不喜欢挂着警告,但我不知道这些警告试图告诉我什么,除了那些定义和与boost相关的东西悬挂在某个没有被使用的地方。但是,我已经定义的所有东西,我都用过了。我正在使用的boost库是随机库和文件系统库。
当我检查警告的来源时,它会调出Boost的error_category.hpp文件并突出显示一些 static const
,它们被注释为“预定义的错误类别”。或“弃用的同义词”。也许这个问题与我在使用库时的错误处理(或缺少)有关?
任何人都可以就这些警告突然出现的原因提供一些见解吗?我完全错过了什么吗?
P.S。警告是最高级别。
解决方案
这与Boost.System库中的error_code库有关。 Boost error_codes包含两个属性:值和类别。为了使error_codes可扩展以便库用户可以设计自己的错误类别,boost设计人员需要某种方式来表示唯一的错误代码类别。一个简单的ID号是不够的,因为这可能导致两个项目使用冲突的ID号来表示自定义错误类别。
基本上,他们所做的是以静态对象的形式使用内存地址,这些对象继承自基类 error_category
。除了用作特定错误类别的唯一标识符之外,这些变量实际上不会执行任何操作。因为它们本质上是在内存中具有唯一地址的静态虚拟对象,所以您可以轻松创建自己的自定义错误类别,这些类别不会干扰其他错误类别“ID”。有关详细信息,请参见此处
我想你所看到的是这个设计决定的副作用。由于这些变量从未在程序中实际使用过,因此编译器会生成警告。我只想说,我认为你做错了什么。
其他提示
我同意@Charles Salvia,但是至少在Boost 1.44.0中添加了这些定义,这些定义现在已被包装 - 被排除在已弃用之外。因此,如果您不使用它们,请在包含头文件之前包含以下行:
#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif
我尝试了@ M.Tibbits建议的 BOOST_SYSTEM_NO_DEPRECATED
,它似乎删除了一些警告实例(在linux下构建的大系统中),但不是全部。
但是,使用 -isystem
而不是 -I
来包含boost标头(并忽略它们的问题)对我有用。
建议 https://exceptionshub.com/how-do-you-disable-the-unused-variable-warnings-coming-out-of-gcc.html
由GNU GCC解释(倾斜): http://gcc.gnu .ORG / onlinedocs / GCC /指南-Options.html