11

我目前收到的编译器警告类似于我在问题标题中给出的警告。诸如……之类的警告

warning: 'boost::system::generic_category' defined but not used

warning: 'boost::system::posix_category' defined but not used

warning: 'boost::system::errno_ecat' defined but not used

warning: 'boost::system::native_ecat' defined but not used

据我所知,该程序没有受到任何影响。但是,我不喜欢到处出现警告,但我不知道这些警告试图告诉我什么,除了定义的和与 boost 相关的东西在不被使用的地方徘徊。但是,我定义的所有内容,我都使用过。我使用的 boost 库是随机库和文件系统库。

当我检查警告的来源时,它会打开 Boost 的 error_category.hpp 文件并突出显示一些static const被注释为“预定义错误类别”或“不推荐使用的同义词”的 s。也许问题与我在使用库时的错误处理(或缺少)有关?

谁能提供一些关于为什么会弹出这些警告的见解?我完全错过了什么吗?

PS 警告处于最高级别。

4

3 回答 3

21

我同意@Charles Salvia 的观点,但想补充一点,至少从 Boost 1.44.0 开始,这些定义现在已被包装——被排除在已弃用的情况下。因此,如果您不使用它们,只需在包含头文件之前包含以下行:

#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif
于 2010-09-17T16:14:47.210 回答
7

这与 Boost.System 库中的 error_code 库有关。Boost error_codes 包含两个属性:值和类别。为了使 error_codes 可扩展,以便库用户可以设计自己的错误类别,boost 设计人员需要某种方式来表示唯一的错误代码类别。一个简单的 ID 号是不够的,因为这可能导致两个项目对自定义错误类别使用冲突的 ID 号。

所以基本上,他们所做的就是使用内存地址,以从基类继承的静态对象的形式error_category。这些变量实际上并没有做任何事情,除了作为某个错误类别的唯一标识符。因为它们本质上是在内存中具有唯一地址的静态虚拟对象,所以您可以轻松创建自己的自定义错误类别,而不会干扰其他错误类别“ID”。请参阅此处了解更多信息。

我想你看到的是这个设计决定的副作用。由于这些变量从未在您的程序中实际使用过,因此编译器会生成警告。我只想说,我不认为你做错了什么。

于 2009-11-29T04:05:39.637 回答
1

我尝试了BOOST_SYSTEM_NO_DEPRECATED@M.Tibbits 的建议,它似乎删除了一些警告实例(在 linux 下构建的大型系统中),但不是全部。

但是,使用-isystem而不是-I包含增强标头(并忽略它们的问题)确实对我有用。

https://exceptionshub.com/how-do-you-disable-the-unused-variable-warnings-coming-out-of-gcc.html建议

由 GNU GCC 解释(间接):http: //gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

于 2018-05-09T16:28:38.810 回答